目录
1.问题详情
Could not extract response: no suitable HttpMessageConverter found for response type [class com.hhmt.delivery.utils.response.ocpx.MeiTunVo] and content type [text/html;charset=UTF-8]
2.问题原因
响应数据绑定时候不支持Content-type text/html这种格式,一般支持json
3.解决办法
package com.hhmt.delivery.config;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.ArrayList;
import java.util.List;
/**
* 辉煌明天
* FileName: WxMappingJackson2HttpMessageConverter
* <p>
* Author: huachun
* email: huachun_w@163.com
* Date: 2021/11/18 17:44
* Description:
*/
public class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
/**
* @Description: 处理常见的响应Content-type问题
* 例如:响应Content-type:text/html 无法正常绑定到响应类中
* 详情参考:https://blog.csdn.net/qq_23888451/article/details/84637956
* @Author: huachun
* @Date: 2021/11/18 18:24
* @return: null
**/
public WxMappingJackson2HttpMessageConverter() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.TEXT_PLAIN);
mediaTypes.add(MediaType.TEXT_HTML); //加入text/html类型的支持
setSupportedMediaTypes(mediaTypes);// tag6
}
}
在使用之前进行添加
restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());
ResponseEntity<MeiTunVo> response = restTemplate.getForEntity(meituanUrl, MeiTunVo.class, entry);
这样就不会报错了
4.常见转换问题
响应时类型转换错误
通过下面调用restTemplate调用出现了下面异常提示
restTemplate.getForObject(realUrl, QuickViewVo.class);
org.springframework.web.client.RestClientException: Error while extracting response for type [class com.hhmt.delivery.ocpx.bean.ResultVo] and content type [text/html]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (PushbackInputStream); line: 1, column: 2]
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (PushbackInputStream); line: 1, column: 2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.2.11.RELEASE.jar:5.2.11.RELEASE]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.2.11.RELEASE.jar:5.2.11.RELEASE]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105) ~[spring-web-5.2.11.RELEASE.jar:5.2.11.RELEASE]
... 111 common frames omitted
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (PushbackInputStream); line: 1, column: 2]
将响应类型改为String
restTemplate.getForObject(realUrl, String.class);
得到的结果如下(如果响应类不改变,在postman调用是正常返回的)
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty</center>
</body>
</html>
问题原因:
解决方法:
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
HttpClient httpClient = HttpClientBuilder.create()
.setRedirectStrategy(new LaxRedirectStrategy())
.build();
factory.setHttpClient(httpClient);
restTemplate.setRequestFactory(factory);
原文参考:使用RestTemplate报301 Moved Permanently解决_Lihaitao-CSDN博客_resttemplate请求返回301