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

RestTemplate.exchange响应解析失败,返回200仍报错求助

问题分析与解决方案

错误根源

服务器返回的响应内容是纯文本字符串:Successfully handled the request,但响应的Content-Type被标记为application/json。Jackson JSON转换器尝试将该纯文本解析为JSON格式时,会因为它不是合法的JSON(合法JSON字符串需要被双引号包裹,比如"Successfully handled the request")而抛出解析错误。

解决方案

方案1:修正服务器端返回格式

让服务器返回合法的JSON内容,两种常见方式:

  • 返回带双引号的JSON字符串:
ResponseEntity.ok().body("\"Successfully handled the request\"");
  • 返回JSON对象(更规范的API设计):
Map<String, String> responseBody = new HashMap<>();
responseBody.put("message", "Successfully handled the request");
ResponseEntity.ok().body(responseBody);

方案2:修改客户端接收类型

将客户端的响应类型从Object.class改为String.class,让RestTemplate使用字符串转换器直接读取响应内容,无需JSON解析:

HttpHeaders headers = new HttpHeaders();
headers.set(TENANT_ID_HEADER, event.getTenantId());
HttpEntity<InputObj> requestEntity = new HttpEntity<>(inputObj, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(
                url,
                HttpMethod.POST,
                requestEntity,
                String.class
            );

方案3:调整RestTemplate转换器优先级(不推荐)

如果必须坚持使用Object.class接收,可以调整RestTemplate的转换器顺序,让StringHttpMessageConverter的优先级高于Jackson转换器,这样会优先以字符串形式读取响应:

RestTemplate restTemplate = new RestTemplate();
// 获取现有转换器列表
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
// 找到StringHttpMessageConverter并移到最前面
for (int i = 0; i < converters.size(); i++) {
    if (converters.get(i) instanceof StringHttpMessageConverter) {
        StringHttpMessageConverter stringConverter = (StringHttpMessageConverter) converters.remove(i);
        converters.add(0, stringConverter);
        break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:07:44