簡體   English   中英

Java 8日期/時間(JSR-310)類型與Spring Data MongoDB的映射

[英]Java 8 Date/Time (JSR-310) types mapping with 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<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); } } 
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM