在一个Springcloud项目中,有小伙伴就遇到一个这样的问题。先来看看代码
返回的数据结构:
被调用方:
调用方:
运行,报错日志:
出现LinkedHashMap can not be cast to xxx,终于把小伙伴的bug复现了
思考:为什么不能进行User对象强转呢,哪里来的LinkedHashMap?
打个断点调试一下
返回的结果可以看出data对象携带的数据为LinkedHashMap类型,LinkedHashMap强转为User肯定会报错。
为什么会出现LinkedHashMap?
猜想:
feign调用底层还是使用的restTemplate,发送http请求,数据传输经过序列化与反序列化,json数据传输,json类似与map结构,为了使接收到的数据有序,选择了linkedhashmap。
RestTemplate -> postForObject()方法经过不断地debug,在UntypedObjectDeserializer -> mapObject()中终于找到了数据被转换成LinkedHashMap的方法。
在dowhile里进行对JsonParser的循环并装进LinkedHashMap。
解决方案1:
利用fastjson,将得到的data数据转成json串,再将json串转成对应的User
@GetMapping("/{id}")
public ResultInfo selectById(@PathVariable("id") int id) {
ResultInfo resultInfo = userClient.selectById(id);
User u = JSONObject.parseObject(JSON.toJSONString(resultInfo.getData()), User.class);
return ResultInfo.ok(u);
}
复制
解决方案2:
ResultInfo返回数据类型增加泛型
被调用方的controller和调用方的client
调用方controller不变
再启动调式一下
这样就能进行强转了,所以说泛型还是非常强大的。
文章转载自码酱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。