如何解决默认不支持 Joda 日期/时间类型 `org.joda.time.DateTime`

Ben*_*end 12 java hibernate

我有一个现有的网络应用程序,不幸的是数据库中的“时间”字段没有转换为祖鲁时间。相反,我们使用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
Run Code Online (Sandbox Code Playgroud)

在 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"])
Run Code Online (Sandbox Code Playgroud)

想知道为什么在更新到 5 之前这会在 hibernate 4 中工作?我正在使用 joda-time 版本 2.1,但已经能够在 2.9.7 中重现该问题

我还查看并发现了这个线程Persist Joda-time's DateTime via Hibernate但是,他们的解决方案是转换为 Joda's 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>
Run Code Online (Sandbox Code Playgroud)

小智 32

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

 import com.fasterxml.jackson.datatype.joda.JodaModule;

 ObjectMapper mapper = new ObjectMapper()
    .registerModule(new JodaModule())
    ...;
Run Code Online (Sandbox Code Playgroud)

在 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

  • 即使注册 Joda 模块后我仍然收到错误。`objectMapper.registerModule(new JodaModule())` 我还确认了整个代码库中只有一个 ObjectMapper 引用。 (2认同)