Проблема с сериализацией даты при обновлении с Wildfly 11 до Wildfly 15 - PullRequest
2 голосов
/ 10 июня 2019

Мы недавно мигрировали из 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 Пример

pre-upgrade date serialization

Wildfly 15 Пример

post-upgrade date serialization

Поленастроен как DATE в 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, и это не сработало

Ответы [ 3 ]

3 голосов
/ 10 июня 2019

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

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
}
3 голосов
/ 10 июня 2019

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

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

В соответствии с документацией:

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

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

1 голос
/ 11 июня 2019

У нас возникла эта проблема после обновления нашего сервера приложений 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-файл конфигурации контекстных компонентов добавьте запись <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" />
...