调用API时出现“Could not find acceptable representation”错误如何解决?
解决RestTemplate调用出现406 Not Acceptable错误的方法
错误原因分析
406 Not Acceptable错误表示服务器无法返回客户端请求中指定的媒体类型,或者客户端发送的Accept请求头与服务器支持的响应格式不匹配,导致服务器找不到合适的响应表示。
具体解决步骤
1. 明确设置请求的Accept头为application/json
RestTemplate的getForEntity方法默认的Accept头可能包含多种媒体类型(如application/json、application/xml等),如果服务器对这些类型的支持有冲突,就会触发406错误。需要显式指定只接受JSON格式:
// 创建请求头,设置Accept为application/json HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity<String> requestEntity = new HttpEntity<>(headers); // 使用exchange方法发送请求,替代getForEntity ResponseEntity<ApiResponse> apiResponse = restTemplate.exchange( url, HttpMethod.GET, requestEntity, ApiResponse.class );
2. 确保RestTemplate配置了Jackson JSON消息转换器
如果RestTemplate没有正确配置MappingJackson2HttpMessageConverter,Spring无法正确处理JSON的序列化/反序列化,也可能导致媒体类型匹配失败。可以通过配置Bean来添加转换器:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 创建并配置Jackson消息转换器 MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); jsonConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); // 添加到RestTemplate的消息转换器列表 restTemplate.getMessageConverters().add(jsonConverter); return restTemplate; }
3. 验证服务器端的响应格式
用Postman或curl调用目标URL,检查响应的Content-Type头是否为application/json:
- 如果服务器返回的是其他格式(如
text/html),需要确认服务器是否支持JSON响应,或者调整请求参数让服务器返回JSON。
4. 检查POJO的JSON映射正确性
虽然406错误不是映射失败直接导致,但确保POJO的注解正确可以避免后续解析问题:
- 确认
@JsonProperty的字符串与JSON响应中的键完全匹配(包括特殊字符{{}},Java字符串中无需转义这些符号); - 确保所有需要映射的字段都有对应的
@JsonProperty注解,且@JsonIgnoreProperties(ignoreUnknown = true)已正确添加,忽略不需要的字段。
内容的提问来源于stack exchange,提问作者Kaushik Mahadevan
相关产品推荐
相关产品推荐

