Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射 [英] Java 8 Date/Time (JSR-310) types mapping with Spring Data MongoDB

查看:184
本文介绍了Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有Java 8日期/时间字段的简单文档

I have simple document with Java 8 date/time fields

@Document
public class Token {
    private Instant createdAt;
    ...
}

我想坚持使用Spring Data MongoDB版本1.5。但是 java.time.Instant 类型的字段无法正确反序列化,因为 MappingMongoConverter 缺少<$ c的转换器$ c> java.time 类。

that I want to persist with Spring Data MongoDB version 1.5. But fields of type java.time.Instant could not be de-serialized correctly because MappingMongoConverter lacks converters for java.time classes.

在Spring 4中,我找到了 org.springframework.format.datetime.standard.DateTimeConverters ,其中包含不同的转换器包括 InstantToLongConverter LongToInstantConverter 声明为私有静态类。

In Spring 4 I found org.springframework.format.datetime.standard.DateTimeConverters with different Converters including InstantToLongConverter and LongToInstantConverter declared as private static classes.

如何配置 MongoTemplate 使用它们来映射 Instant 字段到多头?

How can I configure MongoTemplate to use them to map Instant fields to longs?

推荐答案

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

I don't know if this is the best way but I added Java 8 Date/Time (JSR-310) types support to Spring Data MongoDB 1.5.0.RELEASE like this:


  1. 第一步。添加简单的Spring 转换器 s

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 注册这些自定义转换器像这样:

  • Second step. Register these custom Converters with MappingMongoConverter in your AbstractMongoConfiguration implementation like this:

    @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 将作为字符串保留。

    Now your document's Instant fields will be persisted as long values and LocalDates as Strings.

    这篇关于Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆