从 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.Datejava.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 时的日期序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 10.1 消耗所有内核

jboss升级到WIldfly后fd限制警告

如何忽略/升级 JBoss Wildfly 9 中的模块?

Primefaces 与 Wildfly 中的 Yasson 有啥关系吗?

WildFly 12:错误 jboss.remoting.management.channel.registry

从 JBoss 7 迁移到 WildFly 9 时使用 CMT 的 EJB