前言
最近公司给了个任务,让我跟第三方接口联调,正好项目使用的是SpringBoot那我自然而然想到了SpringMVC提供的RestTemplate 来进行远程调用,但是在使用RestTemplate远程调用时出现了点问题…
提示:以下是本篇文章正文内容,下面案例可供参考
1.引入代码
代码如下(示例):
ResponseEntity<String> responseEntity = restTemplate.postForEntity(activityParameterConfig.getPakageProvide() + "?sign=" + sign, jsonValue, String.class);
String body = responseEntity.getBody();
System.out.println("body = " + body);
在将结果转化为String时成功获取到了结果:
body = {"status":100,"msg":"发送成功","info":{"telphonenum":"*******1272","list":[{"ticketnum":"94330075353","start_use_date":"2021-03-09","end_use_date":"2031-03-09"}],"serial":"fa6b0592741a4d838c6a4737323c0c34","serial_number":"202103091614452220"}}
但是直接转换为String还要再将其转换为DTO,所以索性就选择直接选择在RestTemplate封装结果时直接装换为对应DTO
2.引入代码
代码如下(示例):
ResponseEntity<GiftDistributeResDTO> entity = restTemplate.postForEntity(activityParameterConfig.getPakageProvide() + "?sign=" + sign, jsonValue, GiftDistributeResDTO.class);
GiftDistributeResDTO distributeResDTO = entity.getBody();
System.out.println("distributeResDTO = " + distributeResDTO);
结果报错了…提示没有对应的HttpMessageConverter处理类型为Content Type [text/html;charset=utf-8]] 的数据。
2021-03-09 16:14:47.221 ERROR 13548 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.demo.user.dto.GiftDistributeResDTO] and content type [text/html;charset=utf-8]] with root cause
org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.demo.user.dto.GiftDistributeResDTO] and content type [text/html;charset=utf-8]
总结
于是Debug了下发现RestTemplate中存在7种转换器:
其中将结果转换为我们要的DTO的是MappingJackson2HttpMessageConverter这个转换器,再进去看看这个转换器属性:
结果发现这个转换器所支持的MediaTypes不存在上述text/html这种类型,所以才会报错,既然找到了问题那就在创建RestTemplate时给它多加一些支持的类型:
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : converters) {
if(httpMessageConverter instanceof MappingJackson2HttpMessageConverter){
ArrayList<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.ALL);
((MappingJackson2HttpMessageConverter) httpMessageConverter).setSupportedMediaTypes(mediaTypes);
}
}
return restTemplate;
}
再次调试发现结果已经可以正常封装到我们需要的DTO了:
distributeResDTO = GiftDistributeResDTO(status=100, msg=发送礼包成功!, info=GiftDistributeInfo(telphonenum=*******1272, serial_number=202103091641391875, serial=27c66dbdce6a476481e895b852d82fd3, list=[GiftDistributeList(ticketnum=94330070661, start_use_date=2021-03-09, end_use_date=2031-03-09)]), url=null)
希望不足之处大家多指教啦😊😊