[英]Java 8 Date/Time (JSR-310) types mapping with Spring Data MongoDB
I have simple document with Java 8 date/time fields 我有Java 8日期/时间字段的简单文档
@Document
public class Token {
private Instant createdAt;
...
}
that I want to persist with Spring Data MongoDB version 1.5. 我希望坚持使用Spring Data MongoDB 1.5版。 But fields of type
java.time.Instant
could not be de-serialized correctly because MappingMongoConverter
lacks converters for java.time
classes. 但
java.time.Instant
类型的字段无法正确反序列化,因为MappingMongoConverter
缺少java.time
类的转换器。
In Spring 4 I found org.springframework.format.datetime.standard.DateTimeConverters
with different Converter
s including InstantToLongConverter
and LongToInstantConverter
declared as private static classes. 在Spring 4中,我找到了带有不同
Converter
的org.springframework.format.datetime.standard.DateTimeConverters
,包括声明为私有静态类的InstantToLongConverter
和LongToInstantConverter
。
How can I configure MongoTemplate
to use them to map Instant
fields to longs? 如何配置
MongoTemplate
以使用它们将Instant
字段映射到longs?
I don't know if this is the best way but I added Java 8 Date/Time (JSR-310) types support to Spring Data MongoDB 1.5.0.RELEASE
like this: 我不知道这是不是最好的方法,但我添加了Java 8日期/时间(JSR-310)类型支持Spring Data MongoDB
1.5.0.RELEASE
如下所示:
First step. 第一步。 Add simple Spring
Converter
s 添加简单的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); } }
Second step. 第二步。 Register these custom
Converter
s with MappingMongoConverter
in your AbstractMongoConfiguration
implementation like this: 在您的
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())); } }
Now your document's Instant
fields will be persisted as long values and LocalDate
s as Strings. 现在,您的文档的
Instant
字段将作为长值LocalDate
, LocalDate
作为字符串保留。
@user882209 explained it all just perfectly. @ user882209完美地解释了这一切。
Since Spring Data MongoDB 1.7 the support for JSR-310 has been added. 自Spring Data MongoDB 1.7以来,添加了对JSR-310的支持。
If application is backed by Spring Boot every version over 1.2.8 would contain it as well. 如果应用程序由Spring Boot支持,则每个超过1.2.8的版本也会包含它。
In a Spring Boot-ed app you can just do it the following: 在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);
}
}
The following converters are provided by the Jsr310Converters
class: Jsr310Converters
类提供以下转换器:
DateToLocalDateTimeConverter - LocalDateTimeToDateConverter DateToLocalDateConverter - LocalDateToDateConverter DateToLocalTimeConverter - LocalTimeToDateConverter DateToInstantConverter - InstantToDateConverter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.