从Wildfly 11升级到Wildfly 15时的日期序列化问题

3
我们最近从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示例:

pre-upgrade date serialization

Wildfly 15示例

post-upgrade date serialization

该字段在MySQL中配置为日期类型

enter image description here

示例实体

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,但没有成功

1
你尝试过在变量上使用所需的格式进行注解吗,例如@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")? - Deˣ
3个回答

4

虽然我无法确定你当前的设置/配置,但如果你配置了ObjectMapper,你可能会得到预期的行为:

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
}

谢谢,这个方法非常有效!(我们稍微修改了一下,因为我们没有使用Spring Boot) - George Artemiou
1
谢谢George!如果您能评论一下您所做的调整,我将更新我的答案以包括那些内容,以供未来读者参考。 - Sofo Gial

3
我不知道它为什么会表现出这种方式,但我会将字段类型更改为java.util.Date,然后使用@Temporal注释。
必须为java.util.Datejava.util.Calendar类型的持久字段或属性指定此注释。它只能用于这些类型的字段或属性。
根据文档:

世界时区数据可以有日期、时间或者时间戳精度(即实际日期、仅时间或两者兼备)。使用@Temporal 注释进行微调。

然后你的Rest库将处理Java日期和ISO之间的转换。如何配置取决于您正在使用的JSON序列化程序,这是Jackson中Date的默认格式。

谢谢您的回复,我们已经尝试将日期类型更改为java.util.Date,但这并没有解决我们的问题,这很奇怪。我们还尝试添加@Temporal注释,但同样没有效果。 - George Artemiou
好的...如果Wildfly正在使用Jackson,请尝试在字段上方添加此注释 @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT") - Japheth Ongeri - inkalimeva

2
我们在将Wildfly应用服务器从11升级到15以及将Java从8升级到11后遇到了这个问题。
基于@Sofo Gial的已接受答案,以下方法对我们使用的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);
    }

}

在您的上下文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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接