我们正在从Joda迁移到Java Time。目前我们在实体中使用Joda的DateTime
。据我所知,DateTime
在Java中相当于两种类型:OffsetDateTime
和ZonedDateTime
。由于我们将把它们持久化到数据库中,因此我们将使用OffsetDateTime
(对此有什么评论吗?)。
现在的问题是如何正确配置Jackson的ObjectMapper
。
我在网上找到的所有示例都是关于本地类型的,这些类型Jackson已经提供了de/serializer实现(例如LocalDateTime
、LocalDateTimeSerializer
和LocalDateTimeDeserializer
)。
最终,我成功地做到了这样:
public class OffsetDateTimeSerializer extends StdSerializer<OffsetDateTime> {
private final DateTimeFormatter formatter; // We need custom format!
public OffsetDateTimeSerializer(DateTimeFormatter formatter) {
super(OffsetDateTime.class);
this.formatter = formatter;
}
@Override
public void serialize(OffsetDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException {
generator.writeString(value.format(formatter));
}
}
和
public class OffsetDateTimeDeserializer extends StdDeserializer<OffsetDateTime> {
private final DateTimeFormatter formatter; // We need custom format!
public OffsetDateTimeDeserializer(DateTimeFormatter formatter) {
super(OffsetDateTime.class);
this.formatter = formatter;
}
@Override
public OffsetDateTime deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
return OffsetDateTime.parse(parser.readValueAs(String.class), formatter);
}
}
现在我的问题是,如何最好地配置Jackson的ObjectMapper
来进行Java 8日期时间值的序列化/反序列化?
更新:被接受的答案并没有真正解决我的问题(请阅读评论中的讨论)。我最终使用了比我在上面提出的代码更简单的代码。您也可以看看我的回答。
2016-05-11T17:32:20.897+0000
或2016-05-11T17:32:20.897+00:00
(没有Zulu符号)(我们希望支持多种输入格式)。 - Rad