文章目录
- 前言
- 一、可能原因
- 二、解决方案
- 2.1、升级nacos(可忽略)
- 2.2. 自定义日期反序列化格式
- 总结
前言
springboot 默认json 序列化使用jackon 正常配置jackon.date-format=yyyy-MM-dd HH:mm:ss 即可格式化日期格式,但是由于项目引用各种jar和拦截器,导致此配置失效。具体原因不明。
一、可能原因
添加拦截器并继承 WebMvcConfigurationSupport 后会覆盖@EnableAutoConfiguration关于WebMvcAutoConfiguration的配置!从而导致所有的Date返回都变成时间戳。
二、解决方案
查询大部分解决方案都是实现WebMvcConfigurer 在内部自己转换。只是大部分网上的代码cv后都不生效。
既然jackon的配置失效如此脆弱,那么为了防止合作开发时其他人又引入了什么jar包或者拦截器,我们采用自定义序列化日期的方式。
ps:试过用fastjson转换,但是fastjson对时区转换不友好,最后摒弃。
2.1、升级nacos(可忽略)
- 升级nacos为2.2.7.RELEASE,升级后发现nacos-client将序列化组件已经更改为jackson,nacos客户端也顺便升级一下2.1.0
2. 如果报错找不到nacos logging类则指定alibaba.cloud版本
<spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.2. 自定义日期反序列化格式
该类可以放在底层common包内,这样其他服务引入common即可生效。
@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {
public WebMvcConfigure() {
}
//日期反序列化格式化
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return (builder) -> {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DateStyle.YYYY_MM_DD_HH_MM_SS.getValue())));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DateStyle.YYYY_MM_DD_HH_MM_SS.getValue())));
builder.modules(new Module[]{javaTimeModule});
};
}
//其他默认注入bean
@Bean
public FeignHeaderConfig FeignHeaderConfig() {
return new FeignHeaderConfig();
}
@Bean
public OkHttpClient.Builder okHttpClientBuilder() {
return (new OkHttpClient.Builder()).addInterceptor(new FeignOkHttpClientConfig());
}
@Bean
public FilterConfig filterConfig() {
return new FilterConfig();
}
}
spring.factories 自动注入该配置类,如果不是common引入的方式可以不需要自动注入
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
com.cuzue.bg.generic.common.autoconfig.WebMvcConfigure
总结
本文只是解决了日期反序列化后格式化的问题,其实也是比较稳定的解决方式。
但是没有分析为什么jackon配置失效的问题,希望有了解的同学指点一下。