关于使用RestTemplate远程调用时遇到的问题

前言

最近公司给了个任务,让我跟第三方接口联调,正好项目使用的是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)

希望不足之处大家多指教啦😊😊

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值