Проблема с сериализацией даты при обновлении с Wildfly 11 до Wildfly 15

Недавно мы перешли с Wildfly 11 на Wildfly 15 и с Java 8 на Java 11 и заметили изменение в том, как Джексон сериализует объекты Date. Мы используем Jackson v2.9.8 для сериализации объектов и Spring v5.0.9.

До нашего обновления объект даты был бы сериализован в формате ISO, например, "2019-11-12", но после обновления поля даты начали отображаться как метки времени, например, "1573516800000". Кто-нибудь еще сталкивался с этой проблемой раньше? это то, что можно настроить в standalone.xml?

Пример Wildfly 11

Пример Wildfly 15

Поле настроено как DATE в MySQL

Пример сущности

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 и это не сработало

3 ответа

Решение

Хотя я не могу быть уверен в вашей текущей настройке / конфигурации, если вы настраиваете ObjectMapperвы, вероятно, получите ожидаемое поведение:

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

Я не знаю, почему это так, но я бы изменил тип поля на java.util.Date а затем использовать @Temporal аннотаций.

Эта аннотация должна быть указана для постоянных полей или свойств типа java.util.Date а также java.util.Calendar, Это может быть указано только для полей или свойств этих типов.

Согласно документации:

Временные данные могут иметь точность DATE, TIME или TIMESTAMP (т.е. фактическая дата, только время или оба). Используйте аннотацию @Temporal для точной настройки.

Ваша библиотека Rest будет обрабатывать преобразование между датой Java и ISO. Как настроить, это зависит от того, какой сериализатор JSON вы используете, это формат по умолчанию для даты в Джексоне.

У нас возникла эта проблема после обновления нашего сервера приложений 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) В вашем контексте XML-файл конфигурации bean-компонентов добавьте <mvc:message-converters> вход между <mvc:annotation-driven> теги и создать бин из 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" />
Другие вопросы по тегам