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 示例

升级前日期序列化

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.Datejava.util.Date,但没有奏效
4

3 回答 3

4

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

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
}
于 2019-06-10T15:02:31.913 回答
3

我不知道它为什么会这样,但我会将字段的类型更改为java.util.Date然后使用@Temporal注释。

必须为类型java.util.Date和的持久字段或属性指定此注释java.util.Calendar。只能为这些类型的字段或属性指定它。

根据文档:

时态数据可以具有 DATE、TIME 或 TIMESTAMP 精度(即实际日期、仅时间或两者兼有)。使用 @Temporal 注释对其进行微调。

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

于 2019-06-10T14:01:10.823 回答
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);
    }

}

2) 在您的上下文 bean 配置 XML 文件<mvc:message-converters>中,在标签之间添加一个条目<mvc:annotation-driven>,并创建一个 bean CustomObjectMapper

<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" />
于 2019-06-11T13:03:20.793 回答