Spring Boot 2.5.4全局Jackson序列化non_null配置未生效问题排查
问题根本原因
你遇到的情况核心原因是Spring MVC处理接口响应时使用的序列化组件,没有加载你配置的Jackson全局规则,结合你给出的调试信息(手动注入ObjectMapper序列化生效、全局配置已加载到Jackson auto config中),常见的触发场景有以下几个,按出现概率从高到低排列:
1. 项目中使用了@EnableWebMvc注解
只要你在任意配置类/启动类上加了@EnableWebMvc,就会完全接管Spring MVC的配置,Spring Boot默认的Web自动配置(包括Jackson消息转换器的自动注入)会全部失效,你在yml或者自定义ObjectMapper的配置都不会被Spring MVC的消息转换器读取。
解决方法:直接删除所有
@EnableWebMvc注解即可,Spring Boot 2.x 无需手动添加该注解就能启用完整的Web能力。
2. 自定义WebMvc配置时重写了configureMessageConverters方法
如果你自己实现了WebMvcConfigurer接口,并且重写了configureMessageConverters方法,该方法默认会清空Spring Boot自动配置的所有消息转换器,如果你没有手动把配置好的Jackson消息转换器加到列表中,就会使用默认无全局规则的Jackson序列化能力。
解决方法:将
configureMessageConverters方法替换为extendMessageConverters方法,该方法只会在默认的转换器列表基础上追加你自定义的转换器,不会覆盖原有配置。如果必须使用configureMessageConverters,需要手动把配置了NON_NULL规则的ObjectMapper对应的消息转换器添加到转换器列表首位。
3. 项目中引入了其他JSON序列化库
如果你的项目依赖里引入了fastjson、gson等其他JSON序列化库的starter,Spring Boot会自动配置对应库的消息转换器,且优先级高于默认的Jackson转换器,此时接口响应序列化根本没有用到Jackson,你配置的Jackson规则自然不会生效。
解决方法:要么排除其他JSON库的自动配置,要么调整消息转换器的优先级,给你自定义的
MappingJackson2HttpMessageConverterBean加上@Order(Ordered.HIGHEST_PRECEDENCE)注解,确保它是第一个被匹配到的序列化转换器。
4. 自定义消息转换器优先级不足
如果你已经配置了自定义的MappingJackson2HttpMessageConverter,但没有设置优先级,可能被后续加载的其他同类型转换器覆盖了规则。
解决方法:给自定义的消息转换器Bean加上最高优先级注解:
@Bean @Order(Ordered.HIGHEST_PRECEDENCE) public MappingJackson2HttpMessageConverter messageMappingConverter() { final var om = new ObjectMapper(); om.setSerializationInclusion(Include.NON_NULL); return new MappingJackson2HttpMessageConverter(om); }
内容的提问来源于stack exchange,提问作者niklasfi

