【发布时间】: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