jackson全局配置没有生效

  • 描述
  • 复现
  • 问题定位
  • 解决
  • 验证
  • 结论
  • 参考

描述

springboot项目中,在application.properties中配置了spring.jackson.date-format=yyyy-MM-dd HH:mm:ss,在我的理解中,如果接口接口返回中有Date类型字段,应该默认返回的是如2023-03-13 01:02:03这种格式的,但是实际发现是个long时间戳(或者其他格式的时间)。那么,问题出在哪里了呢。

复现




问题定位

google了一下,发现是@EnableWebMvc影响的。但是为什么会影响到,不太理解。所以得翻翻代码。

@EnableWebMvc这个注解会@Import(DelegatingWebMvcConfiguration.class)DelegatingWebMvcConfiguration继承WebMvcConfigurationSupport。这就导致@EnableAutoConfiguration自动加载类时忽略了WebMvcAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
// 此时已经有了WebMvcConfigurationSupport,所以 WebMvcAutoConfiguration  不会加载了
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

正常场景下,WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#configureMessageConverters(List<HttpMessageConverter<?>> converters) 会引入 converts,但是此时因为没加载,所以没引入。然后走了WebMvcConfigurationSupport#addDefaultHttpMessageConverters(this.messageConverters),这里是加入了默认的converts。默认的不会使用全局配置,所以全局配置没生效。

解决

@Configuration
@Slf4j
public class JacksonConfig implements WebMvcConfigurer {@Autowiredprivate ObjectMapper objectMapper;/*** @EnableWebMvc 使用该注解后,需要手动配置  addInterceptors() 和 addResourceHandlers()*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new HandlerInterceptor() {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("JacksonConfig");return HandlerInterceptor.super.preHandle(request, response, handler);}}).addPathPatterns("/**").excludePathPatterns("/swagger-ui.html").excludePathPatterns("/null/**").excludePathPatterns("/swagger-resources/**").excludePathPatterns("/swagger/**").excludePathPatterns("/webjars/**").excludePathPatterns("/v2/**");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}/*** 填充全局 objectMapper* https://stackoverflow.com/questions/45734108/spring-boot-not-using-configured-jackson-objectmapper-with-enablewebmvc* @param converters*/@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.stream().filter(p -> p instanceof MappingJackson2HttpMessageConverter).map(p -> (MappingJackson2HttpMessageConverter)p).forEach(p -> p.setObjectMapper(objectMapper));WebMvcConfigurer.super.extendMessageConverters(converters);}
}

验证

这里格式符合要求了,时区还有点问题。在加个配置就好了spring.jackson.time-zone=GMT+8

结论

@EnableWebMvc 这个注解影响到jackson配置,说实话真没想到。以往看源码也是扫一眼就完事,没仔细看。没考虑到相互之间的影响。目前,其实我对于为啥使用这个注解也表示不太理解,常用的可以通过实现WebMvcRegistrationsWebMvcConfigurer来解决。

参考

stackOverFlow解答

jackson全局配置没有生效相关推荐

  1. ajax设的全局配置没有生效,ajaxSetup设置全局请求

    ajaxSetup设置全局请求 发布时间:2020-07-21 13:22:37 来源:51CTO 阅读:894 作者:wx5d1d7cf454d00 本地是用localhost访问项目的,页面里面请 ...

  2. vue.config.js配置不生效_华为QoS流策略配置教程

    3.QoS流策略配置 3.1.创建一个流策略并进入流策略视图,或进入已存在的流策略视图 [Huawei]traffic policy 1 match-order ? auto Auto order c ...

  3. 记一次Linux修改MySQL配置不生效的问题

    背景 自己手上有一个项目服务用的是AWS EC2,最近从安全性和性能方面考虑,最近打算把腾讯云的MySQL数据库迁移到AWS RDS上,因为AWS的出口规则和安全组等问题,我需要修改默认的3306端口 ...

  4. mysql 修改配置生效_MySQL修改my.cnf配置不生效的解决方法

    本文实例讲述了MySQL修改my.cnf配置不生效的解决方法.分享给大家供大家参考,具体如下: 一.问题: 修改了 my.cnf 配置文件后,却不生效,这是怎么回事? 二.原因: 我们注意到,这里只说 ...

  5. .Net Core 全局配置读取管理方法 ConfigurationManager

    最近在学习.Net Core的过程中,发现.Net Framework中常用的ConfigurationManager在Core中竟然被干掉了. 也能理解.Core中使用的配置文件全是Json,不像F ...

  6. tnsnames.ora配置未生效_1分钟了解网络交换机的6种命令配置模式

    我们在配置交换机的时候首先要了解的就是交换机命令模式,小编用Cisco思科交换机为例带大家了解交换机的6种配置模式. Cisco IOS提供了用户EXEC模式和特权EXEC模式两种基本的命令执行级别, ...

  7. SpringBoot的@Conditional和自动配置类生效

    @Conditional原理    在之前的博客中提到了关于自动配置的原理,但是在自动配置的时候有很多的判断,只有当这些判断都成功之后在自动配置的时候才会成功.但是我们会发现一个问题,当我们使用@Be ...

  8. tnsnames.ora配置未生效_一文了解网络交换机的6种命令配置模式

    我们在配置交换机的时候首先要了解的就是交换机命令模式,小编用Cisco思科交换机为例带大家了解交换机的6种配置模式. Cisco IOS提供了用户EXEC模式和特权EXEC模式两种基本的命令执行级别, ...

  9. 理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)

    BPDU Filtering也叫BPDU过滤,它的意义是在某个端口上过滤BPDU的发送和接收,在这里需先要来理解一个前提:任何一个加入到生成树的交换机端口,都会发送并接收到相应的BPDU报文,其中包括 ...

最新文章

  1. 在创业公司,不懂运维的程序员如何兼顾公司的运维工作
  2. 怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...
  3. vc2010 mysql5.7_VC2010利用MySQL++访问mysql. 及连接池示例
  4. python-pymysql模块的使用入门
  5. MySQL从零到一解读增量同步数据到elasticsearch canal adapter方式(binlog)实现
  6. iconv 判断字符编码_php下用iconv函数转换字符编码的问题
  7. python读二进制文件博客园_python二进制读写文件
  8. 1.5 案例:多项式曲线拟合的比较
  9. LVS负载均衡群集-NAT
  10. 离线bootstrap_css下载
  11. 在scrapy爬虫框架xpath中extract()方法的使用
  12. 比特率与波特率有何差别?—Vecloud
  13. 360浏览器+7654联盟
  14. python处理矩阵运算、转置矩阵、逆矩阵、单位矩阵
  15. SRS之SrsConfig类
  16. 七天免登陆有效期 java_JWT过期刷新问题,实现十五天免登陆
  17. 春节青岛-江浙沪自驾游
  18. 《五代史通俗演义》推荐——不良人粉丝的一点敬意.
  19. 偏微分方程数值解---学习总结(1)
  20. 企业电子样册制作的模板

热门文章

  1. Golang实现socket编程
  2. 一篇文章带你了解3D 打印机,新手点进来
  3. 电脑文件管理,教你在众多文件名中插入相同的日期
  4. threejs 绘制球体_web前端入门到实战:threejs 绘制地球、飞机、轨迹
  5. ubuntu18.04在双显卡笔记本安装cuda开发环境
  6. 字符串日期转时间戳的解决办法且时间戳[10,13]位区别
  7. 小游戏《虎吃羊》java 源码
  8. finereport的 SQL函数
  9. 有哪些好看颜值高的蓝牙耳机?高颜值蓝牙耳机排行榜
  10. node-little-db小型本地json文件数据库