SpringBoot添加自定义HttpMessageConverter不起作用

本文探讨了在Spring Boot项目中如何添加自定义HttpMessageConverter以统一处理接口返回值,遇到的问题是由于默认消息处理器排序导致自定义类无效。解决方案包括移除默认转换器并重新排列,或通过继承WebMvcConfigurationSupport重写相关方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

我们项目中用的是第二种方法,自定义一个配置类,然后实现WebMvcConfigurer接口然后再实现WebMvcConfigurer接口中的方法来做自己项目的整体配置。例如实现addInterceptors方法,对特定的url进行拦截或者过滤。
在这里插入图片描述

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

在这里插入图片描述

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值