利用feign调用返回object类型转换成实体

 更新时间:2022年03月16日 15:43:41   作者:Sue_小石头  
这篇文章主要介绍了利用feign调用返回object类型转换成实体,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

feign调用返回object转成实体

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>
ObjectMapper mapper=new ObjectMapper();
CourseMaster courseMaster = mapper.convertValue(bean,CourseMaster.class);
List<CourseMaster> list=(List<CourseMaster>)courseMasterList;//返回为Object类型
for(Object cs:list){
    CourseMaster courseMaster = mapper.convertValue(cs,CourseMaster.class);
}

feign调用报类型转换错误

问题现象

springcloud feign服务间调用,运行至下图1代码A处报错:

java.util.LinkedHashMap cannot be cast to(报错如下图2所示)

排查过程

step1:大多数情况下,第一反应是仔细检查语法是否有问题,确认lambda表达式本身没有问题;

step2:在确认写的没有问题的情况下,将代码片段拎出来写一个main方法运行(如图1代码片段B),发现单独拿出来在main方法中运行时正常!

step3:此时陷入困惑,于是重新仔细阅读报错信息:LinkedHashMap cannot be cast to xxx.BaseComapny,可以很清楚的确定是类型转换错误。

再一行一行看代码(图1中代码片段A),发现只有在代码片段A上方的:List list = xxxxx这一段中有可能的类型转换,所以暂时定位至此行代码。

step4:step3中的推测不确定的原因在于:此行代码中responseObject是直接通过服务调用获取到的,请求响应参数中已指定了对象类型,所以我认为这里不存在强制类型转换,也不存在LinkedHashMap。

继续沿着上面的推测,如果确实存在问题,那只可能是通过服务调用获取到的返回参数与预期不一致,step5:于是分别对上面图1中代码A和代码B(也就是main方法)做debug,结果如下图所示,发现确实服务调用后获取的响应参数与main方法中的不一致。可以看到片段A服务调用得到的响应参数list中确实是LinkedHashMap!至此发现问题!

step6:由于确定自己没有对服务调用前后特殊处理过响应参数,所以考虑这是框架行为,至此问题基本找到原因。

问题原因

找出原因后再针对性的百度答案就比较容易得到,简单来说就是使用feign进行远程服务调用的时候,返回参数(在我的代码中,Response中的list部分)会变成LinkedHashMap。

以下是网上能找到的流传最多的解释(因为复制这段话的文章和博客太多了,无法确认谁复制了谁,也无法确认第一个写的作者是谁,所以无法标注出原作者):

这是因为RPC远程调用在底层使用的HTTPClient,所以在传递参数的时候,必定要有个顺序,当你传递Map的时候Map里面的值也要有顺序,不然服务层在接的时候就出问题了,所以它才会从Map转为LinkedHashMap!Spring 有一个类叫ModelMap,继承了LinkedHashMap ,所以一个接口返回的结果就可以直接用ModelMap来接,注意ModelMap是没有泛型的,不管你返回的结果是什么类型的Map,泛型是多复杂的Map,都可以直接new一个ModelMap,用它来接返回的结果。

解决办法

1、最简单的解决办法就是在接收响应参数的地方直接用LinkedHashMap接收,通过kv形式获取到参数;

2、通过json,objectmapper等方式将LinkedHashMap转换成自己想要的对象;

3、对feign调用得到的响应参数做自定义处理(也许可以?);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java使用集合实现通讯录功能

    java使用集合实现通讯录功能

    这篇文章主要为大家详细介绍了java使用集合实现通讯录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Mybatis关联查询遇到的坑-无主键的关联数据去重问题

    Mybatis关联查询遇到的坑-无主键的关联数据去重问题

    这篇文章主要介绍了Mybatis关联查询遇到的坑-无主键的关联数据去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java将文件转成流文件返回给前端详细代码实例

    java将文件转成流文件返回给前端详细代码实例

    Java编程语言提供了强大的文件处理和压缩能力,下面这篇文章主要给大家介绍了关于java将文件转成流文件返回给前端的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • springboot中请求地址转发的两种方案

    springboot中请求地址转发的两种方案

    在开发过程中,我们经常需要将请求从一个服务转发到另一个服务,以实现不同服务之间的协作,本文主要介绍了springboot中请求地址转发的两种方案,感兴趣的可以了解一下
    2023-11-11
  • 开发10年,全记在这本Java进阶宝典里了

    开发10年,全记在这本Java进阶宝典里了

    这篇文章主要给大家分享介绍了这本Java进阶宝典里,是开发10年总结出来的,文中通过图文介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-04-04
  • 详解如何给Sprintboot应用添加插件机制

    详解如何给Sprintboot应用添加插件机制

    这篇文章主要为大家介绍了如何给 Sprintboot 应用添加插件机制,文中有详细的解决方案及示例代码,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • Spring refresh()源码解析

    Spring refresh()源码解析

    这篇文章主要为大家介绍了Spring refresh()源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 利用SpringBoot实现多数据源的两种方式总结

    利用SpringBoot实现多数据源的两种方式总结

    关于动态数据源的切换的方案有很多,核心只有两种,一种是构建多套环境,另一种是基于spring原生的AbstractRoutingDataSource切换,这篇文章主要给大家介绍了关于利用SpringBoot实现多数据源的两种方式,需要的朋友可以参考下
    2021-10-10
  • Java实现去掉字符串重复字母的方法示例

    Java实现去掉字符串重复字母的方法示例

    这篇文章主要介绍了Java实现去掉字符串重复字母的方法,涉及java针对字符串的遍历、判断、运算等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • java 引用传递的三种类型小结

    java 引用传递的三种类型小结

    这篇文章主要介绍了java 引用传递的三种类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论