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

Sok*_*lov 11 java java-8 spring-data spring-data-mongodb java-time

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

@Document
public class Token {
    private Instant createdAt;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

在Spring 4中,我发现org.springframework.format.datetime.standard.DateTimeConverters了不同的Converters包括InstantToLongConverterLongToInstantConverter声明为私有静态类.

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

Sok*_*lov 14

我不知道这是不是最好的方法,但我添加了Java 8 Date/Time(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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二步.在您的实现中注册这些自定义Converters,如下所示:MappingMongoConverterAbstractMongoConfiguration

    @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()));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,您的文档Instant字段将保留为长LocalDate字符串和字符串.

  • 但是这个转换器已经从春季4.0.1版本开始提供.请参阅`org.springframework.format.datetime.standard.DateTimeConverters` (2认同)