Проблема с сериализацией даты при обновлении с 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" />