暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Feign调用返回LinkedHashMap问题

码酱 2021-01-01
4685
目前非常流行restful风格,并且大多数项目前后端分离都采用json的数据格式进行交互,feign底层基于http协议,调用时就会有一个问题,那就是格式问题。

        在一个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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论