【发布时间】:2015-01-21 08:57:20
【问题描述】:
我有以下类,我想使用 Spring Data 将其存储在 MongoDB 中
@Document()
public class Tuple2<T extends Enum<T>> {
@Id
private String id;
@Indexed
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private final Instant timeCreated;
...
}
DateTimeFormat 注释 javadoc 状态:
声明应将字段格式化为日期时间。 支持按样式模式、ISO 日期时间模式或自定义格式模式字符串格式化。可应用于 java.util.Date、java.util.Calendar、java.long.Long、Joda-Time 值类型;从 Spring 4 和 JDK 8 开始,到 JSR-310 java.time 类型也是如此。
我使用的是 Spring 4.1.1 和 JDK 8,所以我希望它适用于 Instant。但是,实际存储的内容如下:
"timeCreated" : {
"seconds" : NumberLong(1416757496),
"nanos" : 503000000
}
如果我按照this answer 中的说明编写并注册从 Instant 到 Date 的自定义转换器,那么它可以工作,但是我想避免这种情况,因为我确信一定有更好的方法。
在进一步挖掘 Spring 源代码后,我发现以下类 Jsr310DateTimeFormatAnnotationFormatterFactory 看起来很有希望:
使用 JDK 8 中的 JSR-310 java.time 包格式化带有 DateTimeFormat 注释的字段。
它的源没有引用Instant,但它确实引用了OffsetTime 和LocalTime。即便如此,当我在示例中将 Instant 更改为 OffsetDateTime 时,它仍然存储为复合对象而不是 ISODate。
缺少什么?
【问题讨论】:
标签: java spring spring-data spring-data-mongodb java-time