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

如何让Spring RestTemplate将纯文本当作JSON处理?

解决RestTemplate处理text/plain格式JSON响应的转换问题

这个问题我踩过好几次坑了!核心原因很明确:RestTemplate自带的MappingJackson2HttpMessageConverter默认只认application/json这类标准的JSON媒体类型,而你的接口返回的Content-Type是text/plain; charset=utf-8,导致转换器完全不会去处理这个响应,直接抛出了找不到合适转换器的错误。

下面给你几个实用的解决方案,按推荐程度排序:

方案1:修改现有转换器的支持类型(最推荐)

直接给默认的JSON转换器添加对text/plain类型的支持,不需要额外写新类,代码量最少:

RestTemplate restTemplate = new RestTemplate();
// 遍历所有消息转换器,找到JSON转换器
for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
    if (converter instanceof MappingJackson2HttpMessageConverter) {
        MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
        // 添加text/plain到支持的媒体类型列表
        jsonConverter.getSupportedMediaTypes().add(MediaType.TEXT_PLAIN);
        break;
    }
}

// 现在调用getForObject就能正常映射到ModelDto了
ModelDto result = restTemplate.getForObject(url, ModelDto.class);

方案2:自定义专属的TextPlain JSON转换器

如果你不想修改全局的转换器配置,可以自定义一个只处理text/plain类型的JSON转换器,然后注册到RestTemplate中:

// 自定义转换器
public class TextPlainJsonConverter extends MappingJackson2HttpMessageConverter {
    public TextPlainJsonConverter() {
        super(new ObjectMapper());
        // 明确指定只支持text/plain类型
        setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN));
    }
}

// 注册到RestTemplate
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new TextPlainJsonConverter());

方案3:Spring Boot全局配置RestTemplate

如果是在Spring Boot项目里,你可以通过配置类全局统一配置RestTemplate的转换器,这样所有地方使用的RestTemplate都能处理text/plain的JSON:

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        customizeJsonConverter(restTemplate);
        return restTemplate;
    }

    private void customizeJsonConverter(RestTemplate restTemplate) {
        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter)
                        .getSupportedMediaTypes()
                        .add(MediaType.TEXT_PLAIN);
            }
        }
    }
}

方案4:单次调用时指定接受类型

如果你只需要在某一次请求中处理这种情况,可以用exchange方法手动指定接受的媒体类型:

ResponseEntity<ModelDto> response = restTemplate.exchange(
        url,
        HttpMethod.GET,
        null,
        new ParameterizedTypeReference<ModelDto>() {},
        MediaType.TEXT_PLAIN
);
ModelDto result = response.getBody();

以上几种方法都能解决你的问题,根据自己的项目场景选就行,我个人最常用的是方案1,简单直接不啰嗦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:40:58