当前位置: 首页 > 面试题库 >

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

茅华灿
2023-03-14
问题内容

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

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

我想继续使用Spring Data MongoDB
1.5版。但是类型字段java.time.Instant不能正确反序列化,因为MappingMongoConverter缺少java.time类的转换器。

在春季4中,我发现org.springframework.format.datetime.standard.DateTimeConverters使用包含不同Converter的,InstantToLongConverter并将其LongToInstantConverter声明为私有静态类。

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


问题答案:

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

  1. 第一步。添加简单的Spring 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);
        }
    }
  1. 第二步。注册这些自定义的Converter与S 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作为字符串保留为long值和。



 类似资料:
  • 我有一个带有Java 8日期/时间字段的简单文档 我想坚持使用Spring Data MongoDB版本1.5。但是类型的字段无法正确反序列化,因为缺少类的转换器。 在Spring 4中,我发现具有不同的s,包括和声明为私有静态类。 如何配置MongoTemplate以使用它们将即时字段映射到长字段?

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

  • 在Java8次/JSR 310/threeten.orgbackport... 问:如何解析日期部分和时间部分之间带有“T”或“空格”的ISO-8601时间戳? ISO-8601时间戳格式指定了文字“T”,以将日期规范与时间规范分开: 许多应用程序以这种格式生成时间戳,并使用空格“char”而不是“T”。参考文献表明,ISO-8601允许通过相互协议实现这一点。 因为我从多个来源摄取数据,所以我想

  • 主要内容:YEAR 类型,TIME 类型,DATE 类型,DATETIME 类型,TIMESTAMP 类型MySQL 中有多处表示日期的数据类型: YEAR、 TIME、 DATE、 DTAETIME、 TIMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。 每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。 下表中列出了 MySQL 中的日期与时间类型。 类型名称 日期格式 日期范围 存储需求 YEAR YYYY 1901 ~ 2155 1 个字

  • 11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型 11.3.4. Y2K事宜和日期类型 表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新

  • 何时何地哪个更可取? 我不知道他们之间到底有什么区别。 来自LocalDateTime的文档 ...时间表示为纳秒精度。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在 LocalDateTime 中。 我假设LocalDateTime也可以接受纳秒。所以我想,我可以用LocalDateTime替换我的代码,它们被声明为TimeStamp。如果我错了,请纠