【问题标题】:SPRING MVC DateTimeFormat errorSPRING MVC DateTimeFormat 错误
【发布时间】:2018-10-12 04:31:06
【问题描述】:

我正在尝试使用 Spring + Angular JS 创建一个网站,而我目前的问题是我使用 POSTMAN 发布如下 JSON 语句:

{
    "id": 12345,
    "checkin" : "2017-03-01",
    "checkout" : "2017-03-05"
}

然后弹出这个错误: enter image description here

“类型定义错误:[简单类型,类 java.time.LocalDate];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造 java.time.LocalDate 的实例(没有创建者,如默认构造,存在):没有字符串参数构造函数/工厂方法来反序列化字符串值('2017-03-01')“

资源代码:

@RequestMapping(path = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
        consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<ReservationResponse> createReservation(
        @RequestBody
        ReservationRequest reservationRequest){
    return new ResponseEntity<>(new ReservationResponse(), HttpStatus.CREATED);
}

型号代码:

public class ReservationRequest {
    private Long id;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkin;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkout;}

APIConfig 代码:

@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModules(new JavaTimeModule());
    return new ObjectMapper();
}

应用程序属性:

spring.jackson.serialization.write-dates-as-timestamps=false

构建 Gradle:

compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.7'

【问题讨论】:

  • 您使用的是 Spring Boot,因此您不需要显式配置的 ObjectMapper。只需将 JavaTImeModule 注册为 @Bean 即可。如果您使用的是 Spring Boot 2,您甚至不需要这样做,因为 Spring 5 会在存在时自动注册 JavaTImeModule
  • 哇,谢谢!我刚刚删除了对象映射器,它工作了!感谢您的帮助,先生!

标签: java spring spring-mvc datetime-format


【解决方案1】:

我们也遇到了同样的问题,在定义转换器后它工作正常。您可以在应用程序中添加以下代码,它应该可以正常工作。您可以根据需要更改日期格式。

@Bean
    public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
       MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
       ObjectMapper objectMapper = new ObjectMapper();
          objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
          objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, true);
          objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
          objectMapper.setDateFormat(new SimpleDateFormat("dd MMM yyyy hh:mm:ss a"));
      jsonConverter.setObjectMapper(objectMapper);

      return jsonConverter;
     }

【讨论】:

    【解决方案2】:

    我正在学习相同的教程并遇到了相同的问题。使我的代码工作的原因是将 API Config Code 中 objectMapper() 方法的返回值从 new ObjectMapper() 更改为 objectMapper

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多