我有一个带有 Java 8 日期/时间字段的简单文档
@Document
public class Token {
private Instant createdAt;
...
}
我想坚持使用 Spring Data MongoDB 1.5 版。但是 java.time.Instant
类型的字段无法正确反序列化,因为 MappingMongoConverter
缺少 java.time
类的转换器。
在 Spring 4 中,我发现 org.springframework.format.datetime.standard.DateTimeConverters
具有不同的 Converter
,包括 InstantToLongConverter
和 LongToInstantConverter
声明为私有(private)静态类。
如何配置 MongoTemplate
以使用它们将 Instant
字段映射到 long?
最佳答案
我不知道这是否是最好的方法,但我向 Spring Data MongoDB 1.5.0.RELEASE
添加了 Java 8 日期/时间 (JSR-310) 类型支持,如下所示:
第一步。添加简单的 Spring
Converter
public class InstantToLongConverter implements Converter<Instant, Long> { @Override public Long convert(Instant instant) { return instant.toEpochMilli(); } } public class LongToInstantConverter implements Converter<Long, Instant> { @Override public Instant convert(Long source) { return Instant.ofEpochMilli(source); } } public class LocalDateToStringConverter implements Converter<LocalDate, String> { @Override public String convert(LocalDate localDate) { return localDate.toString(); } } public class StringToLocalDateConverter implements Converter<String, LocalDate> { @Override public LocalDate convert(String source) { return LocalDate.parse(source); } }
第二步。在您的
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
字段将作为长值保留,LocalDate
作为字符串保留。
关于Java 8 日期/时间 (JSR-310) 类型与 Spring Data MongoDB 的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23972002/