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

标签 java java-8 spring-data spring-data-mongodb java-time

我有一个带有 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) 类型支持,如下所示:

  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 字段将作为长值保留,LocalDate 作为字符串保留。

关于Java 8 日期/时间 (JSR-310) 类型与 Spring Data MongoDB 的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23972002/

相关文章:

java - 我无法理解 Java 8 中的一些 lambda 表达式

java - 将 lambda 作为方法参数传递并排序映射

java - 在 Spring Data JPA 中的单个事务中保存、删除和更新

java - 当 net-snmp get 返回响应事件时,为什么 snmp 代理不接受 snmp4j get 上的请求

java - 如何将 JOGL 与 NetBeans 平台捆绑在一起?

java - 在 Java 8 中对两个 ArrayList 进行乘法和求和

java - 使用 Spring Data JPA 处理 POST 请求中的关系

java - 一个集合中的spring data jpa查询值

java - 使用外部枚举定义从 JAX-RS 端点生成 Swagger

javascript - 有没有办法使用 javascript 和 Angular 或任何其他 javascript 从可编辑的 pdf 中获取数据