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
相关产品推荐
相关产品推荐

