gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:44:44 32 4
gpt4 key购买 nike

我有 REST 网络服务公开资源和创建日期。它是用 Java 8 编写的 - 使用 LocalDateTime。 Jackson 2 正在将其序列化为:

“创建日期”:[2016, 5, 19, 18, 6, 59, 639000000]

在其他应用程序中,我的目标是消耗这些剩余时间,但只有 Java 7,所以我决定在 DTO 中使用 joda-time 库。我已经像这样设置了 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);

POST 成功,但是在反序列化答案时(使用上面的 createdDate 字段)抛出异常:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Value 696000000 for millisOfSecond must be in the range [0,999] (through reference chain: com.foobar.dto.user.UserItem["createdDate"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Value 696000000 for millisOfSecond must be in the range [0,999] (through reference chain: com.foobar.dto.user.UserDisplayItem["createdDate"])

我的依赖是这样的:

    <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>

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

最佳答案

我相信 Jackson 使用 nanosecond 序列化 Java 8 时间类型默认精度,而 Joda-Time 只支持 milliseconds .在用 Java 8 编写的服务器中,您需要序列化 ​​LocalDateTime。属性为 "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 有相应的 DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS 标志。可悲的是,我不认为 joda module目前支持它(参见 implementation )。因此,我认为您现在唯一的选择是实现自定义反序列化器,或者更好的是,提交 PR 以改进 joda 模块。

关于java - 将 java.util.time.LocalDateTime 反序列化为 joda LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329002/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com