数据库
首页 > 数据库> > Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射

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

作者:互联网

我有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,包括声明为私有静态类的InstantToLongConverter和LongToInstantConverter.

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

解决方法:

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

>第一步.添加简单的弹簧转换器

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

>第二步.在您的AbstractMongoConfiguration实现中使用MappingMongoConverter注册这些自定义转换器,如下所示:

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

标签:java,java-8,spring-data,spring-data-mongodb,java-time
来源: https://codeday.me/bug/20190930/1836165.html