使用Jackson JSR310模块反序列化LocalDateTime

我正在使用描述Jackson数据类型JSR310页面的库,但我仍然难以让它工作。

我配置了以下bean:

@Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JSR310Module()); return mapper; } 

当我调用我的REST API时,日期格式输出是yyyy-MM-dd'T'HH:ss.SSSSSS ,例如2015-04-11T00:10:38.905847 。 这可以通过我的AngularJS代码处理得很好。

当我想向REST API提交内容时,日期将发布为yyyy-MM-dd'T'HH:mm:ss.SSS'Z' ,例如2015-04-09T08:30:00.000Z

jackson一直在抱怨’Z’。 如果我查看文档中的LocalDateTimeDeserializer ,它使用DateTimeFormatter.ISO_LOCAL_DATE_TIME ,该文件沸腾到ISO_LOCAL_DATE'T'ISO_LOCAL_TIME并且它提到它没有覆盖区域。

所以我想我应该在我正在创建的ObjectMapper上设置DateFormat

 @Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JSR310Module()); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); return mapper; } 

但这没有任何作用。 我将其更改为yyyy-MM-dd类的简单内容,但序列化日期保留为以前的格式,反序列化也不受影响。

我在这做错了什么才能让它发挥作用? 我的JavaScript代码中的日期格式是,据我所知ISO 8601格式…

没有必要编写自己的序列化程序。 它足够使用默认的一个,但是使用另一种格式( time_zone一个)创建一个实例,以便超出部分:

 new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME) 

在我的情况下,我有一个像这样的contextResolver来实现配置级别:

 @Service @Provider public class ObjectMapperContextResolver implements ContextResolver { private final ObjectMapper mapper; public ObjectMapperContextResolver() { mapper = new ObjectMapper(); JavaTimeModule javaTimeModule=new JavaTimeModule(); // Hack time module to allow 'Z' at the end of string (ie javascript json's) javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME)); mapper.registerModule(javaTimeModule); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); } @Override public ObjectMapper getContext(Class type) { return mapper; } } 

目前, LocalDateTimeDeserializer似乎不尊重为对象映射器设置的日期格式。

要使其工作,您可以覆盖LocalDateTimeDeserializer或切换为使用ZoneDateTime ,它最后处理’Z’字符。

这是一个例子:

 public class Java8DateFormat { public static void main(String[] args) throws IOException { final ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JSR310Module()); // mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); final String date = mapper.writeValueAsString(new Date()); System.out.println(date); System.out.println(mapper.readValue(date, ZonedDateTime.class)); } } 

输出:

 "2015-04-11T18:24:47.815Z" 2015-04-11T18:24:47.815Z[GMT] 

Hibernate 4,Spring 4 – REST WS,Client – Spring Boot 1.5.2。 在我的例子中,我使用Entity ZonedDateTime类来映射数据库中的Timestamp 。 Hibernate以及Spring Boot REST工作正常。 我只能将库添加到pom文件中:

    com.fasterxml.jackson.core jackson-annotations ${jackson.version}    com.fasterxml.jackson.datatype jackson-datatype-jsr310 ${jackson.version}  

所以我想,转换器也是在Spring for LocalDateTime中实现的.jackson.version是最新的。