SpringBoot升级到2.0后默认时间格式变化

  • 背景:项目从 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);
	}

	...
	...
	...


}

 

请登录后发表评论