最近开发中遇到个比较奇怪的现象,一直以来我们都是用RestController返回json,
default-property-inclusion: non_null把null值过滤,但是突然间有个项目,
这样的配置和注解就失效了.
同样的代码在之前项目可以,新项目不行,就要考虑架构问题,是不是引入了什么,把配置给覆盖了。
原因排查:
全局查找代码 发现有个类继承了 WebMvcConfigurationSupport ,而在spring boot官方文档中有提示,
我们可以写个@EnableWebMvc 点进去看看,里面import了一个DelegatingWebMvcConfiguration
所以我们可以得出结论:@EnableWebMvc 其实就是开启WebMvcConfigurationSupport 。
而我们可以在WebMvcAutoConfiguration这个springmvc自动配置类中看到,@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
也就是说 当不存在 WebMvcConfigurationSupport 的时候 ,WebMvcAutoConfiguration自动配置才会生效
结论:
spring文档提示不能写@EnableWebMvc注解 但它并不是最终原因,因为@EnableWebMvc最终开启了WebMvcConfigurationSupport,也就是说WebMvcConfigurationSupport才是问题根本所在。
我们写了一个类 继承了WebMvcConfigurationSupport 导致WebMvcAutoConfiguration失效
(同理 有@EnableWebMvc也会导致WebMvcAutoConfiguration失效)
从而导致了RestController不返回json, 以及 default-property-inclusion配置也失效 (当然 还可能也其它的诸多问题)
那么问题来了,为什么有的项目我们能见到@EnableWebMvc呢?
在早期的ssm项目中,配置springmvc有两种方式,一种是直接实现WebMvcConfigurationSupport,
另一种就是实现WebMvcConfigurer 并加上@EnableWebMvc注解了
(前文提过@EnableWebMvc作用就是开启WebMvcConfigurationSupport,博主见到比较多的是第二种方式)
在springboot中,因为有了WebMvcAutoConfiguration自动配置,可以不需要@EnableWebMvc,
如果我们或许需要更多的自定义功能 那就可以加上@EnableWebMvc 将默认配置进行覆盖
@RestController不返回json 解决方法
所以 如果项目中,继承WebMvcConfigurationSupport的类 没什么很大作用 或者可以其它方式替代,我们可以不再使用这个类,如果这个类是必不可少的,或者不确定用途,我们只好通过注解的形式,完成返回json及过滤空值的功能:
转json解决方案:
在controller层 RequestMapping或GetMapping等注解中加上格式,强制转成json:
@GetMapping(headers = “Accept=application/json” ,produces =“application/json;charset=UTF-8” )
过滤null解决方案:
在实体类中加上注解 @JsonInclude(JsonInclude.Include.NON_NULL)