我有一个类想使用Spring Data存储到MongoDB中。
如果我按照这个答案的解释编写并注册了一个从Instant到Date的自定义转换器,它是有效的,但我想避免使用它,因为我相信一定有更好的方法。
在进一步深入研究Spring源代码后,我发现了以下看起来很有希望的类`Jsr310DateTimeFormatAnnotationFormatterFactory`:
缺少什么?
@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
}
如果我按照这个答案的解释编写并注册了一个从Instant到Date的自定义转换器,它是有效的,但我想避免使用它,因为我相信一定有更好的方法。
在进一步深入研究Spring源代码后,我发现了以下看起来很有希望的类`Jsr310DateTimeFormatAnnotationFormatterFactory`:
它的源代码没有参考`Instant`,但它确实参考了`OffsetTime`和`LocalTime`。即使这样,在我的示例中将`Instant`更改为`OffsetDateTime`之后,它仍然作为复合对象存储,而不是ISO日期。使用JDK 8中的JSR-310 java.time包格式化使用DateTimeFormat注解注释的字段。
缺少什么?
Jsr310DateTimeFormatAnnotationFormatterFactory
中有一个OffsetDateTime
,但它没有被格式化好。 - Vic