我正在使用Spring Boot 1.4以及以下工作。我已定义@Bean
:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
mapper.registerModule(new JodaModule());
return new MappingJackson2HttpMessageConverter(mapper);
}
我已经定义了这个DTO:
public class ReportRequest implements Serializable {
private LocalDate startDate;
private LocalDate endDate;
// additional fields and getters/setters omitted
}
我将此数据提交到@RequestBody ReportRequest
的控制器中,并在请求正文中包含以下json:
{
"startDate": "2016-09-01",
"endDate": "2016-09-12"
}
效果很好。但是,我还需要包括时间。所以我改变了一切看起来像这样:
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
private LocalDateTime startDate;
private LocalDateTime endDate;
{
"startDate": "2016-09-01 02:00:00",
"endDate": "2016-09-12 23:59:59"
}
这不起作用。我得到了:
Could not read document: Invalid format: \"2016-09-01 02:00:00\" is malformed at \" 02:00:00\" (through reference chain: com.hightouchinc.dto.ReportRequest[\"startDate\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid format: \"2016-09-01 02:00:00\" is malformed at \" 02:00:00\" (through reference chain: com.hightouchinc.dto.ReportRequest[\"startDate\"])
更新:我修改了以下内容:
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"));
并且可以发送"2016-09-01T02:00:00"
并且它有效。但是从两者中删除T
仍然会中断。
答案 0 :(得分:1)
LocalDateTimeDeserializer
并未显示传递给setDateFormat()
的值,如JodaModule
中所示:
addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
您可以做的是在注册之前覆盖模块中的默认反序列化器:
JodaModule jodaModule = new JodaModule();
JacksonJodaDateFormat format = new JacksonJodaDateFormat("yyyy-MM-dd HH:mm:ss");
jodaModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(format)));
mapper.registerModule(jodaModule);
并且应使用正确的模式反序列化LocalDateTime
个实例。