Spring Boot中RestTemplate未加载配置的自定义HttpMessageConverter问题
为什么WebMvcConfigurer配置的转换器不被RestTemplate识别?
核心原因:两者属于完全独立的组件体系
WebMvcConfigurer#configureMessageConverters是用来配置Spring MVC服务端的消息转换器,负责处理Controller接收请求(@RequestBody)和返回响应(@ResponseBody)时的JSON/数据格式转换,这套配置只作用于DispatcherServlet的请求处理链,和RestTemplate没有关联。
而RestTemplate(包括TestRestTemplate)是独立的HTTP客户端工具,它有自己专属的HttpMessageConverter集合,用来处理客户端发送请求、接收响应时的格式转换,默认不会自动继承MVC服务端的转换器配置。
额外说明:默认初始化的差异
- MVC服务端的转换器:Spring Boot会自动加载默认的Jackson等转换器,再叠加你通过
WebMvcConfigurer添加的自定义转换器,形成服务端的处理链。 - RestTemplate的转换器:如果是手动
new的实例,默认只加载基础的转换器(比如字符串、字节数组转换器);如果用RestTemplateBuilder创建,会自动引入Spring上下文中所有注册为Bean的HttpMessageConverter,但前提是你的自定义转换器已经被注册为Bean。
实用解决办法
注册自定义转换器为Bean,用RestTemplateBuilder构建实例
把你的MyJsonHttpMessageConverter注册成Spring Bean,再通过RestTemplateBuilder创建RestTemplate,Builder会自动把所有上下文中的转换器加入进去:@Bean public MyJsonHttpMessageConverter myJsonHttpMessageConverter() { return new MyJsonHttpMessageConverter(); } @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); }手动给RestTemplate添加转换器
直接在创建RestTemplate实例时,把自定义转换器加入它的转换器列表:@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 建议放在列表前面,优先使用自定义转换器 restTemplate.getMessageConverters().add(0, new MyJsonHttpMessageConverter()); return restTemplate; }测试环境的
TestRestTemplate,也可以在测试配置类里用同样的方式添加转换器。
内容的提问来源于stack exchange,提问作者nonzaprej
相关产品推荐
相关产品推荐

