从 Wildfly 11 升级到 Wildfly 15 时的日期序列化问题
Posted
技术标签:
【中文标题】从 Wildfly 11 升级到 Wildfly 15 时的日期序列化问题【英文标题】:Date serialization issue while upgrading from Wildfly 11 to Wildfly 15 【发布时间】:2019-10-24 21:53:00 【问题描述】:我们最近从 Wildfly 11 迁移到 Wildfly 15,从 Java 8 迁移到 Java 11,并注意到 Jackson 序列化 Date 对象的方式发生了变化。我们使用 Jackson v2.9.8 进行对象序列化和 Spring v5.0.9。
在我们升级之前,日期对象将以 ISO 格式序列化,例如“2019-11-12”但升级后,日期字段开始显示为时间戳,例如“1573516800000”。有没有其他人遇到过这个问题?这是可以在standalone.xml
中配置的吗?
Wildfly 11 示例
Wildfly 15 示例
该字段在 mysql 中配置为 DATE
示例实体
public class Entity implements java.io.Serializable
@Id
@Column(name = "id")
private Integer id;
@Column(name = "value_date")
private java.sql.Date valueDate;
public java.sql.Date getValueDate()
return valueDate;
public void setValueDate(java.sql.Date valueDate)
this.valueDate = valueDate;
编辑:
我们已尝试将java.sql.Date
更改为 java.util.Date
,但没有成功
【问题讨论】:
您是否尝试使用 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z") 等所需格式对变量进行注释 【参考方案1】:虽然我无法确定您当前的设置/配置,但如果您配置 ObjectMapper
,您可能会得到预期的行为:
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder)
ObjectMapper objectMapper = builder.build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return objectMapper;
【讨论】:
谢谢你的工作就像一个魅力! (由于我们没有使用 Spring Boot,所以有一些 mod) 谢谢乔治!如果您可以评论您所做的调整,我将更新我的答案以包括这些,以供未来的读者使用。【参考方案2】:我不知道为什么会这样,但我会将字段的类型更改为 java.util.Date
,然后使用 @Temporal
注释。
必须为java.util.Date
和java.util.Calendar
类型的持久字段或属性指定此注释。只能为这些类型的字段或属性指定。
根据文档:
时态数据可以具有 DATE、TIME 或 TIMESTAMP 精度(即 实际日期,仅时间,或两者兼而有之)。使用@Temporal 注解 微调一下。
然后,您的 Rest 库将处理 Java Date 和 ISO 之间的转换。如何配置取决于您使用的 JSON 序列化程序,它是 Jackson 中 Date 的默认格式
【讨论】:
感谢您的回复,我们已尝试将日期类型更改为java.util.Date
,但这并没有为我们解决问题,这很奇怪。我们也刚刚尝试添加 @Temporal 注释,它再次没有效果。
好的...尝试在字段上方添加此注释,以防 Wildfly 使用 Jackson @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")
【参考方案3】:
在将 Wildfly 应用服务器从 11 升级到 15 以及将 Java 从 8 升级到 11 后,我们遇到了这个问题。
基于@Sofo Gial 接受的answer,以下方法适用于我们使用 Spring 5.0.9.RELEASE / JDK 11 / Wildfly 15。
1) 创建CustomObjectMapper.java
:
package com.mobizio.rest.spring;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class CustomObjectMapper extends ObjectMapper
public CustomObjectMapper()
super();
configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
2) 在您的上下文 bean 配置 XML 文件中,在 <mvc:annotation-driven>
标记之间添加一个 <mvc:message-converters>
条目,并创建一个 CustomObjectMapper
的 bean:
<mvc:annotation-driven>
...
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
</mvc:message-converters>
...
</mvc:annotation-driven>
<bean id="jacksonObjectMapper" class="com.mobizio.rest.spring.CustomObjectMapper" />
【讨论】:
以上是关于从 Wildfly 11 升级到 Wildfly 15 时的日期序列化问题的主要内容,如果未能解决你的问题,请参考以下文章
Primefaces 与 Wildfly 中的 Yasson 有啥关系吗?