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如下所示:

  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);
        }
    }
  1. 第二步。注册这些自定义的Converter与S 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()));
        }
    }

现在,您文档的Instant字段将LocalDate作为字符串保留为long值和。