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

Spring RestTemplate提取JSON响应报错求助:RestClientException问题

RestTemplate提取JSON响应失败排查

错误信息

org.springframework.web.client.RestClientException: Error while extracting response for type [class  and content type [application/json] 
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:118)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1134)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1117)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:867)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:765)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:676)

问题说明

已确认被调用的API请求成功(日志可查),但在通过RestTemplate提取响应数据转换为CalculatedTaxes对象时触发上述错误。

相关代码

控制器代码

@RequestMapping(value = "/sellers/{seller}/taxes",
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE,
        method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<?> calculate(@RequestHeader HttpHeaders requestHeaders,
                                   @PathVariable("seller") String seller,
                                   @RequestBody Request request)
        throws Exception {

    HttpEntity<Request> entity = new HttpEntity<>(request, requestHeaders);
    ResponseEntity<CalculatedTaxes> response;
    try {
        response = getRestTemplate()
                .exchange(url, HttpMethod.POST, entity, new ParameterizedTypeReference<CalculatedTaxes>() {
                });

        LOGGER.info("Received calculated tax: {}", response.getBody());
    }
}

RestTemplate配置代码

protected RestTemplate getRestTemplate() {
    if (restTemplate != null) {
        return restTemplate;
    }
    restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> converters = new ArrayList<>();
    converters.add(new StringHttpMessageConverter());
    restTemplate.getMessageConverters().addAll(converters);
    return restTemplate;
}

排查方向及解决方法

1. 缺少JSON消息转换器

当前RestTemplate仅配置了StringHttpMessageConverter,没有处理JSON格式的转换器,无法将application/json类型的响应转换为CalculatedTaxes对象。

解决: 添加Jackson JSON转换器,修改getRestTemplate方法:

protected RestTemplate getRestTemplate() {
    if (restTemplate != null) {
        return restTemplate;
    }
    restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> converters = new ArrayList<>();
    converters.add(new StringHttpMessageConverter());
    // 添加JSON转换器
    converters.add(new MappingJackson2HttpMessageConverter());
    restTemplate.getMessageConverters().addAll(converters);
    return restTemplate;
}

注:需确保项目中已引入Jackson相关依赖(spring-boot-starter-web默认包含)。

2. CalculatedTaxes类序列化/反序列化问题

如果JSON转换器已存在,需检查CalculatedTaxes类是否符合Jackson反序列化要求:

  • 必须有无参构造函数
  • 字段名需与响应JSON的键名一致(可通过@JsonProperty注解指定映射关系)
  • 字段需提供getter/setter方法(或设置为public,推荐使用getter/setter)

3. 验证响应JSON格式

临时修改代码,先将响应转换为String类型,查看实际返回的JSON内容是否符合预期:

// 临时调试用
ResponseEntity<String> tempResponse = getRestTemplate()
        .exchange(url, HttpMethod.POST, entity, String.class);
LOGGER.info("Raw response JSON: {}", tempResponse.getBody());

通过打印的原始JSON,对比CalculatedTaxes类的结构,排查字段不匹配、JSON格式错误等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:48:23