SpringBoot添加自定义HttpMessageConverter不起作用

问题:最新项目中在需要加上自定义的消息处理类针对接口的返回值做统一处理,但是发现加上了自定义的HttpMessageConverter不起作用,于是便有了这个文章了。

用法
先说一般添加自定义HttpMessageConverter的方式,一是继承WebMvcConfigurationSupport类,然后重写configureMessageConverters方法。二是实现WebMvcConfigurer接口,然后实现extendMessageConverters方法。

我们项目中用的是第二种方法,自定义一个配置类,然后实现WebMvcConfigurer接口然后再实现WebMvcConfigurer接口中的方法来做自己项目的整体配置。例如实现addInterceptors方法,对特定的url进行拦截或者过滤。
SpringBoot添加自定义HttpMessageConverter不起作用_第1张图片

我们新增的自定义消息处理类就是需要在配置类中实现extendMessageConverters接口,然后在接口中加上自定义消息处理类。我们自定义消息处理类是对返回给前端的json数据进行处理,但是加了以后发现自定义的消息处理类不起作用。

SpringBoot添加自定义HttpMessageConverter不起作用_第2张图片

然后看了一下发现是springboot会默认注册一个MappingJackson2HttpMessageConverter作为application/json类型的消息处理器,在converters集合中的第9位,而我们新加的自定义消息处理类就会排在MappingJackson2HttpMessageConverter下面,在converters集合中的第11位。排在后面的同类型的消息处理器就不起作用了。
SpringBoot添加自定义HttpMessageConverter不起作用_第3张图片
SpringBoot添加自定义HttpMessageConverter不起作用_第4张图片

至于为什么用不到了,可以看下
AbstractMessageConverterMethodArgumentResolver的readWithMessageConverters这个方法,在spring-web提供的jar包下,我的版本是5.3.8。从下图我们可以看出,当有HttpMessageConverter能处理某个类型的数据以后就不会继续看下面的消息处理器了而是直接跳出了。这就解释了为什么我们自定的消息处理类为什么不生效了,因为和springboot默认注册的MappingJackson2HttpMessageConverter都是处理application/json类型的数据,而MappingJackson2HttpMessageConverter排序更靠前。
SpringBoot添加自定义HttpMessageConverter不起作用_第5张图片

解决方法
方法一:在实现的extendMessageConverters方法中移除MappingJackson2HttpMessageConverter,然后再添加我们自定义的消息转换类即可。
SpringBoot添加自定义HttpMessageConverter不起作用_第6张图片
方法二:
启动类或者配置类继承WebMvcConfigurationSupport类,然后重写configureMessageConverters方法。
但是如果启动类继承了WebMvcConfigurationSupport类,那配置类实现WebMvcConfigurer接口所实现的一系列方法将失效,慎重处理。

你可能感兴趣的:(问题解决,自定义消息处理类,springboot返回值,1024程序员节)