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

