将日期字符串映射到日期,包括杰克逊在春天的时间

时间:2016-09-15 13:23:01

标签: spring date spring-boot jackson jodatime

我正在使用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仍然会中断。

1 个答案:

答案 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个实例。