Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射

我有Java 8日期/时间字段的简单文档

@Document public class Token { private Instant createdAt; ... } 

我希望坚持使用Spring Data MongoDB 1.5版。 但java.time.Instant类型的字段无法正确反序列化,因为MappingMongoConverter缺少java.time类的转换器。

在Spring 4中,我找到了带有不同Converterorg.springframework.format.datetime.standard.DateTimeConverters ,包括声明为私有静态类的InstantToLongConverterLongToInstantConverter

如何配置MongoTemplate以使用它们将Instant字段映射到longs?

我不知道这是否是最好的方法,但我添加了Java 8日期/时间(JSR-310)类型支持Spring Data MongoDB 1.5.0.RELEASE如下所示:

  1. 第一步。 添加简单的Spring Converter

     public class InstantToLongConverter implements Converter { @Override public Long convert(Instant instant) { return instant.toEpochMilli(); } } public class LongToInstantConverter implements Converter { @Override public Instant convert(Long source) { return Instant.ofEpochMilli(source); } } public class LocalDateToStringConverter implements Converter { @Override public String convert(LocalDate localDate) { return localDate.toString(); } } public class StringToLocalDateConverter implements Converter { @Override public LocalDate convert(String source) { return LocalDate.parse(source); } } 
  2. 第二步。 在AbstractMongoConfiguration实现中使用MappingMongoConverter注册这些自定义Converter ,如下所示:

     @Configuration @EnableMongoRepositories(basePackages = {"my.app.repository"}) public class MongoConfiguration extends AbstractMongoConfiguration { ... @Override public CustomConversions customConversions() { return new CustomConversions(Arrays.asList( new InstantToLongConverter(), new LongToInstantConverter(), new LocalDateToStringConverter(), new StringToLocalDateConverter())); } } 

现在,您的文档的Instant字段将作为长值LocalDateLocalDate作为字符串保留。

@ user882209完美地解释了这一切。
自Spring Data MongoDB 1.7以来,添加了对JSR-310的支持。
如果应用程序由Spring Boot支持,则每个超过1.2.8的版本也会包含它。
在Spring Boot-ed应用程序中,您可以执行以下操作:

 @Configuration public class MongoDbConfig { @Autowired private MongoDbFactory mongoDbFactory; @Bean public MongoTemplate mongoTemplate() { MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext()); converter.setCustomConversions(new CustomConversions(Arrays.asList(...))); return new MongoTemplate(mongoDbFactory, converter); } } 

Jsr310Converters类提供以下转换器:
DateToLocalDateTimeConverter - LocalDateTimeToDateConverter DateToLocalDateConverter - LocalDateToDateConverter DateToLocalTimeConverter - LocalTimeToDateConverter DateToInstantConverter - InstantToDateConverter