gpt4 book ai didi

java - 这是 jackson-datatype-jsr310 反序列化器中的错误吗?

转载 作者:行者123 更新时间:2023-12-01 20:52:00 27 4
gpt4 key购买 nike

我知道,想象在数千名开发人员每天使用的库中发现错误的想法是自以为是的。所以我认为我的标题问题的答案是“不!!!”,但是......

我有一个对象,其中包含从前端 (JS) 收到的日期,并将其存储到 MongoDB 数据库中。我使用 Spring 获取此对象(使用 REST Controller ),并使用 Spring 执行持久性(使用 MongoDBRepository)。我的计算机配置了 CEST 时钟,即 GMT+2 (UTC +0200)。

我的 POJO 中的日期存储在 LocalDateTime 中。

这是我的对象:

class Test{
LocalDateTime when;
String data;
// getter setters...
}

以下单元测试显示 Spring(使用 jackson-jsr310)用 UTC 日期时间填充我的 LocalDateTime。

mockMvc.perform(post("/test")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content("{\"when\":\"2017-03-31T14:20:28.000Z\",\"data\":\"toto\"}")).andExpect(status().isOk());

List<com.robopec.models.Test> tests = testRepository.findAll();
Assert.assertEquals(14, tests.get(0).getWhen().getHour());

我们可以在jackson源码中看到LocalDateTimeDeserializer.java第 74 行:

 return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);

但是当我保存在数据库中时,spring 使用 spring-data-commons 将 LocalDateTime 转换为日期,然后再将日期存储在数据库中。我们可以阅读spring-data-commons/../Jsr310Converters.java这:

public static enum LocalDateTimeToDateConverter implements Converter<LocalDateTime, Date> {
INSTANCE;
@Override
public Date convert(LocalDateTime source) {
return source == null ? null : Date.from(source.atZone(systemDefault()).toInstant());
}
}

因此,spring-data JSR310 转换器将 localdatetime 解释为默认系统区域中的瞬间。

问题是,当我的前端发送“2017-04-03T20:00:00Z”时,REST Controller 将其存储在 LocalDateTime 中,时间如下:20:00:00。当mongo-data转换器将其转换为日期时,得到的时间是20:00:00+0200(因为我的电脑处于CEST时区)。

我的结论是,我不应该将日期存储在 LocalDateTime 中,而应该存储在 Date (java.util) 或 Instant 中。

但是,其中一个转换器是否存在错误?

最佳答案

如果我没记错的话,最新版本的 mongoDB Java 驱动程序仍然使用 java.util.Date 来存储日期,因此使用 Java 8 时间 api 可能会有点麻烦。

在我从事的一个项目中,几个月前我从 Joda Datetime 切换到了 Java 8 时间。我无法使用 LocalDateTime、ZonedDateTime 等,因此我决定使用 Instant效果很好。只需记住对您的日期使用 ISO8601 Zulu 表示法(“2017-03-31T14:20:28.000Z”),这显然已经是您正在做的事情。

关于java - 这是 jackson-datatype-jsr310 反序列化器中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43194043/

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