使用Spring MVC Rest API获取数据时遇HttpMessageConverter匹配错误
问题分析与解决方案
核心问题
异常明确指出:没有合适的HttpMessageConverter能将text/html;charset=ISO-8859-1类型的响应转换为ResponseBean。这是因为Spring RestTemplate默认的JSON转换器(如MappingJackson2HttpMessageConverter)仅支持application/json等标准JSON媒体类型,无法处理HTML类型的响应。
可能的两种场景:
- 远程接口实际返回JSON数据,但错误设置了
Content-Type为text/html; - 远程接口返回的是HTML内容(比如错误页面、静态页面),但你期望将其转换为
ResponseBean。
解决方案
场景1:远程接口返回JSON但Content-Type错误
修改RestTemplate配置,让JSON转换器支持text/html类型:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 获取已有的Jackson转换器,或新建一个 MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); // 添加text/html到支持的媒体类型列表 jacksonConverter.getSupportedMediaTypes().add(MediaType.TEXT_HTML); // 将修改后的转换器加入RestTemplate restTemplate.getMessageConverters().add(jacksonConverter); return restTemplate; }
场景2:远程接口确实返回HTML(如错误页面)
先捕获原始响应内容,判断是否为预期的JSON或错误页面:
- 修改
SmeService的getSMEUser方法,先接收String类型响应:
public ResponseEntity<String> getSMEUser() { return restTemplate.exchange("远程接口URL", HttpMethod.GET, null, String.class); }
- 在调用处判断返回内容:
if (isSME) { ResponseEntity<String> response = smeService.getSMEUser(); String responseBody = response.getBody(); // 判断是否为JSON格式,手动转换为ResponseBean if (isJson(responseBody)) { ObjectMapper objectMapper = new ObjectMapper(); ResponseBean responseBean = objectMapper.readValue(responseBody, ResponseBean.class); // 后续逻辑 } else { // 处理HTML错误页面的情况 exceptionHandlerService.writeLog(new RuntimeException("远程接口返回非JSON响应:" + responseBody)); } }
其中isJson方法可以通过简单的格式判断实现(比如检查是否以{开头、}结尾)。
额外排查点
- 检查远程接口是否正常:可能接口抛出异常,返回了Tomcat默认的错误HTML页面,而非预期的
ResponseBeanJSON。可以通过Postman直接调用远程接口,查看实际返回内容和Content-Type。 - 若远程接口是自己维护的,确保
@ResponseBody注解生效,Spring能正确设置Content-Type: application/json。
内容的提问来源于stack exchange,提问作者MM Vadhaniya
相关产品推荐
相关产品推荐

