You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

实用解决办法

  1. 注册自定义转换器为Bean,用RestTemplateBuilder构建实例
    把你的MyJsonHttpMessageConverter注册成Spring Bean,再通过RestTemplateBuilder创建RestTemplate,Builder会自动把所有上下文中的转换器加入进去:

    @Bean
    public MyJsonHttpMessageConverter myJsonHttpMessageConverter() {
        return new MyJsonHttpMessageConverter();
    }
    
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
    
  2. 手动给RestTemplate添加转换器
    直接在创建RestTemplate实例时,把自定义转换器加入它的转换器列表:

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        // 建议放在列表前面,优先使用自定义转换器
        restTemplate.getMessageConverters().add(0, new MyJsonHttpMessageConverter());
        return restTemplate;
    }
    

    测试环境的TestRestTemplate,也可以在测试配置类里用同样的方式添加转换器。

内容的提问来源于stack exchange,提问作者nonzaprej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:40:27