- 背景:项目从 SpringBoot 1.5 升级到了 2.4
- 问题:http 请求返回前端数据的时候,2.4 版本 Date 类型转换成了 UTC 格式的字符串,而 1.5 是转换成数值类型的时间戳
- 解决:在配置中增加
spring.jackson.serialization.write-dates-as-timestamps=true
根本原因
Spring 处理 HTTP 请求的时候,返回值会被 HttpMessageConverter 写入输出流,其中对 application/json 格式的请求,最终会被 MappingJackson2HttpMessageConverter 处理。
而 Jackson 的默认配置可以参照com.fasterxml.jackson.databind.SerializationFeature
,但WRITE_DATES_AS_TIMESTAMPS(true)
对 Date 类型的处理默认是转换成时间戳,理论上应该没有问题才对。
最终发现,SpringBoot2.x 在org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
中修改了对 Date 类型的转换配置,如下代码:静态块中关闭了转换成时间戳的功能
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
public class JacksonAutoConfiguration {
private static final Map<?, Boolean> FEATURE_DEFAULTS;
static {
Map<Object, Boolean> featureDefaults = new HashMap<>();
featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
featureDefaults.put(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults);
}
...
...
...
}