本篇文章小编给大家分享一下利用feign调用返回object类型转换成实体代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
feign调用返回object转成实体
com.fasterxml.jackson.core jackson-databind 2.9.8
ObjectMapper mapper=new ObjectMapper(); CourseMaster courseMaster = mapper.convertValue(bean,CourseMaster.class); Listlist=(List )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调用得到的响应参数做自定义处理(也许可以?);
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级