Spring Data MongoDB的Java 8日期/时间(JSR-310)类型映射
问题内容:
我有一个带有Java 8日期/时间字段的简单文档
@Document
public class Token {
private Instant createdAt;
...
}
我想继续使用Spring Data MongoDB
1.5版。但是类型字段java.time.Instant
不能正确反序列化,因为MappingMongoConverter
缺少java.time
类的转换器。
在春季4中,我发现org.springframework.format.datetime.standard.DateTimeConverters
使用包含不同Converter
的,InstantToLongConverter
并将其LongToInstantConverter
声明为私有静态类。
如何配置MongoTemplate
使用它们将Instant
字段映射为long?
问题答案:
我不知道这是否是最好的方法,但是我向Spring Data MongoDB添加了Java 8 Date /
Time(JSR-310)类型支持,1.5.0.RELEASE
如下所示:
- 第一步。添加简单的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);
}
}
- 第二步。注册这些自定义的
Converter
与SMappingMongoConverter
在AbstractMongoConfiguration
实现这样的:
@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
作为字符串保留为long值和。