13

我有带有 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的 s 包括InstantToLongConverterLongToInstantConverter声明为私有静态类。

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

4

2 回答 2

15

我不知道这是否是最好的方法,但我向 Spring Data MongoDB 添加了 Java 8 Date/Time (JSR-310) 类型支持,1.5.0.RELEASE如下所示:

  1. 第一步。添加简单的 Spring Converters

    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. 第二步。在您的实现中注册这些自定义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()));
        }
    }
    

现在您的文档的Instant字段将作为长值和LocalDate字符串持久化。

于 2014-06-01T17:57:43.353 回答
3

@user882209 完美地解释了这一切。
从 Spring Data MongoDB 1.7 开始,添加了对 JSR-310 的支持。
如果应用程序由 Sp​​ring 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

于 2016-02-01T17:48:40.763 回答