将java.util.time.LocalDateTime反序列化为joda LocalDateTime

将java.util.time.LocalDateTime反序列化为joda LocalDateTime,java,json,jackson,jodatime,Java,Json,Jackson,Jodatime,我已经让RESTWebService公开了创建日期为的资源。它是用Java8编写的,使用LocalDateTime。Jackson 2正在将其序列化为: “createdDate”:[2016,5,19,18,6,59639000000] 在另一个应用程序中,我的目标是使用剩余的部分,但只有Java7,所以我决定在DTO中使用joda时间库。我已按如下方式设置RestTemplate: RestTemplate restTemplate = new RestTemplate();

我已经让RESTWebService公开了创建日期为的资源。它是用Java8编写的,使用LocalDateTime。Jackson 2正在将其序列化为:

“createdDate”:[2016,5,19,18,6,59639000000]

在另一个应用程序中,我的目标是使用剩余的部分,但只有Java7,所以我决定在DTO中使用joda时间库。我已按如下方式设置RestTemplate:

        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter e = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JodaModule());
        e.setObjectMapper(mapper);
        messageConverters.add(e);
        restTemplate.setMessageConverters(messageConverters);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<NewUserData> request = new HttpEntity<>(user, headers);
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc-portlet</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>2.7.4</version>
    </dependency>
我的依赖项如下所示:

        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter e = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JodaModule());
        e.setObjectMapper(mapper);
        messageConverters.add(e);
        restTemplate.setMessageConverters(messageConverters);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<NewUserData> request = new HttpEntity<>(user, headers);
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc-portlet</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>2.7.4</version>
    </dependency>

org.springframework
spring上下文
3.2.1.1发布
org.springframework
SpringWebMVCPortlet
3.2.1.1发布
org.springframework
弹簧网
3.2.1.1发布
乔达时间
乔达时间
2.9.3
com.fasterxml.jackson.datatype
jackson数据类型joda
2.7.4

我应该编写自己的Jackson反序列化程序还是可以使用其他库/版本?

我相信Jackson默认情况下会精确序列化Java 8时态类型,而Joda Time只支持。在用Java 8编写的服务器中,您需要将属性序列化为
“createdDate:[2016,5,19,18,6,59,639]
,而不是
“createdDate:[2016,5,19,18,6,59,639000000]

通过配置用于序列化的
ObjectMapper
实例,可以在Java 8服务器中更改此行为:

ObjectMapper mapper = ... //this is the instance used to serialize the data
mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);

如果您不能或不想更改Java 8服务器,Jackson有一个相应的
反序列化功能。将\u日期\u时间戳\u读取为\u纳秒
标志。可悲的是,我认为政府目前并不支持这项计划(见附件)。正因为如此,我认为您现在唯一的选择是实现一个自定义反序列化程序,或者更好的是,向joda模块提交一份带有改进的PR。

我已经解决了我的问题。以下是我在服务器上的新jackson配置(而不是使用默认配置):

在客户端应用程序中,我必须更改jackson配置,添加:

mapper.setDateFormat(new ISO8601DateFormat());

为什么要用这种方式而不是字符串日期格式来序列化它?如何将它序列化为字符串格式?我没有以任何方式配置它-只是使用Spring 4 RestController,它具有jackson依赖项jackson-datatype-jsr310和jackson-databind。您可以使用
@JsonFormat
为日期类型声明格式字符串。选择两个版本的
LocalDateTime
都可以序列化/反序列化的格式。默认情况下,Jackson将日期序列化为数值。这可以通过禁用序列化功能来更改。将日期作为时间戳写入。但问题仍然存在,因为日期将以纳秒精度序列化,这将在joda模块反序列化时失败。正确,joda Time的分辨率为毫秒,最多为小数点后3位秒:。相比之下,java.time类的分辨率为纳秒(小数点后9位):Instant类服务器是用Spring 4@RestController编写的,因此我没有以任何方式配置Jackson(请参阅我的评论)。我当然可以,但在这种情况下,当我无法改变这一点时,我该怎么办?我应该用自定义反序列化器手动映射json吗?我已经用java 7服务器上可以做的事情更新了我的应答器,以纳秒精度处理日期。
mapper.setDateFormat(new ISO8601DateFormat());