当前位置: 首页 > 知识库问答 >
问题:

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

东方嘉佑
2023-03-14

我有一个带有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具有不同的Converters,包括InstantToLongConverterLongToInstantConverter声明为私有静态类。

如何配置MongoTemplate以使用它们将即时字段映射到长字段?

共有2个答案

印劲
2023-03-14

@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

符学
2023-03-14

我不知道这是否是最好的方法,但我为Spring Data MongoDB添加了Java 8日期/时间(JSR-310)类型支持。按如下方式释放:

>

  • 第一步。添加简单的SpringConverters

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

    第二步。在您的抽象MongoConfiguration实现中,使用映射MongoConverter注册这些自定义转换器,如下所示:

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

    现在,文档的即时字段将作为长值保存,本地日期字段将作为字符串保存。

  •  类似资料:
    • 问题内容: 我有一个带有Java 8日期/时间字段的简单文档 我想继续使用Spring Data MongoDB 1.5版。但是类型字段不能正确反序列化,因为缺少类的转换器。 在春季4中,我发现使用包含不同的,并将其声明为私有静态类。 如何配置使用它们将字段映射为long? 问题答案: 我不知道这是否是最好的方法,但是我向Spring Data MongoDB添加了Java 8 Date / Ti

    • 本文向大家介绍Java将日期类型Date时间戳转换为MongoDB的时间类型数据,包括了Java将日期类型Date时间戳转换为MongoDB的时间类型数据的使用技巧和注意事项,需要的朋友参考一下 存了一个时间类型(Date)的数据到mongo数据库中,但是前台显示的是一串数字。继而引发了如下问题: Java里面如何把 时间戳 1477387464495 转换为 2016-10-25 17:24:2

    • 问题内容: 您能否说明一下如何为默认系统时区和给定时区获取正确的纪元时间(以毫秒为单位)。 给定 1.时区:GMT + 3 2.以下代码段: 3.输出: 4. System.currentTimeMillis()的 JavaDoc,它指示返回值将是 当前时间与UTC 1970年1月1日午夜之间的差(以毫秒为单位)。 所以为什么 at 的输出与of的输出相同,尽管提及的文档? at 的输出与有所不同

    • 我试图使用Spring Data JPA1.8和Java8Date/Time API JSR-310。 谢谢你@Oliver Gierke的快速回答。我可以通过向packagesToScan属性添加“org.springframework.data.jpa.convert.ThreeTen”来解决这个问题。现在看来工作正常。 作为参考,这里是我的工作数据库相关(测试)配置。

    • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间