如何解析默认情况下不支持的Joda日期/时间类型`org.Joda.time.DateTime`



我有一个现有的web应用程序,不幸的是,DB中的"时间"字段没有转换为zulu时间。相反,我们使用org.joda.time.DateTime作为我们的日期时间和时区封装器。

我正在从hibernate 4.3.7.Final更新到5.3.20.Final
此外,我们让hibernate使用管理这些DateTime对象到数据库的转换

@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime lastUpdatedTimestamp; // <-- org.joda.time.DateTime

在hibernate 5上运行会出现以下错误:

10:22:11,463 ERROR [stderr] (default task-2) com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Joda date/time type `org.joda.time.DateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-joda" to enable handling (through reference chain: org.<company>.crs.model.PermissionEntity["lastUpdatedTimestamp"])

想知道为什么在更新到5之前hibernate 4中会这样做?我使用的是joda时间版本2.1,但已经能够在2.9.7 中重现这个问题

我也看过并发现了这个线程Persist Joda时间';s的DateTime,但是,他们的解决方案是转换为Joda的LocalDateTime,除非我弄错了,否则它不支持我的用例所需的时区。

编辑:我已经添加了请求的模块,但仍然收到相同的错误。我已经用Joda版本进行了测试:2.10.10、2.9.7和2.1

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.12.3</version>
</dependency>

您必须在ObjectMapper上注册JodaModule,如下所示:

import com.fasterxml.jackson.datatype.joda.JodaModule;
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JodaModule())
...;

在Jackson 2.12之前,您不会得到您看到的错误,因为如果遇到Joda对象,Jackson会默认使用BeanSerializer。下面是2.12中添加的代码,它现在引发了一个错误:

https://github.com/FasterXML/jackson-databind/blob/2.13/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java#L288

最新更新