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

Java 这是jackson-datatype-jsr310反序列化程序中的错误吗?,java,spring-data,jsr310,Java,Spring Data,Jsr310,我知道在成千上万的开发人员每天使用的库中发现一个bug是自以为是的。所以我想我的标题问题的答案是“不!!!”,但是 我有一个包含从前端(JS)接收的日期的对象,并将其存储到MongoDB数据库中。我使用Spring获取这个对象(使用REST控制器),并使用Spring执行持久性(使用MongoDBRepository)。我的电脑配置了CEST时钟,所以GMT+2(UTC+0200) 我的POJO中的日期存储在LocalDateTime中 这是我的目标: class Test{ LocalDa

我知道在成千上万的开发人员每天使用的库中发现一个bug是自以为是的。所以我想我的标题问题的答案是“不!!!”,但是

我有一个包含从前端(JS)接收的日期的对象,并将其存储到MongoDB数据库中。我使用Spring获取这个对象(使用REST控制器),并使用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());
但是,当我在数据库中保存数据时,spring使用SpringDataCommons将LocalDateTime转换为日期,然后再将日期存储到数据库中。 我们可以从中看到:

公共静态枚举LocalDateTimeToDateConverter实现转换器{
实例;
@凌驾
公共日期转换(LocalDateTime源){
返回源==null?null:Date.from(source.atZone(systemDefault()).toInstant());
}
}
因此,spring数据JSR310转换器将localdatetime解释为默认系统区域中的一个瞬间

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

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


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

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


在我工作的一个项目中,几个月前我从Joda Datetime切换到Java8时间。我无法使用LocalDateTime、ZonedDateTime等等,所以我决定使用它,而且效果很好。只要记住在日期上使用ISO8601 Zulu符号(“2017-03-31T14:20:28.000Z”),这显然已经是您正在做的事情了。

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


在我工作的一个项目中,几个月前我从Joda Datetime切换到Java8时间。我无法使用LocalDateTime、ZonedDateTime等等,所以我决定使用它,而且效果很好。请记住在日期上使用ISO8601 Zulu符号(“2017-03-31T14:20:28.000Z”),这显然已经是您正在做的事情了。

您使用的是LocalDateTime还是POJO示例建议的LocalDate?你在使用什么数据库?哪个版本的Spring数据?你是对的,我使用的是LocalDateTime(我将编辑我的帖子)。数据库是MongoDB数据库。我使用SpringBootStarter数据mongodb版本1.5.1和jackson-datatype-jsr310:2.8.6是否按照POJO示例的建议使用LocalDateTime或LocalDate?你在使用什么数据库?哪个版本的Spring数据?你是对的,我使用的是LocalDateTime(我将编辑我的帖子)。数据库是MongoDB数据库。我使用spring boot starter数据mongodb 1.5.1版,jackson-datatype-jsr310:2.8.6这也是我的结论。这也是我的结论。
 return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);
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());
        }
    }