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.InstantMappingMongoConverterjava.time

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

如何配置使用它们将字段映射到多头?MongoTemplateInstant


答案 1

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

  1. 第一步。添加简单的弹簧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. 第二步。在您的实现中注册这些自定义 s,如下所示:ConverterMappingMongoConverterAbstractMongoConfiguration

    @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()));
        }
    }
    

现在,文档的字段将保留为长值,s 将保留为字符串。InstantLocalDate


答案 2

@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


推荐