远程调用 feign 接口,该接口返回的是 “List<AssemblyNameVo>” ,也就是 List<实体类> 对象,但是调用者在实际接收的时候,得到的却是 “List<LinkedHashMap>” 对象
远程接口如下:
feign 的接口如下:
可以看到,调用者在请求该 feign 接口后,返回的对象是 “List<LinkedHashMap>” ,而不是我上面定义的实体类对象 “List<AssemblyNameVo>”
使用格式强制转换也没用,导致向下执行会报错:
java.util.LinkedHashMap cannot be cast to XXX对象
至于为什么返回的数据为什么会变成 LinkedHashMap,网上查了下原因,大致回复都是:
因为rpc远程调用在底层还是使用的HTTPClient,所以在传递参数的时候,必定要有个顺序,当你传递集合(list/map)的时候集合里面的值也要有顺序,不然服务层在接的时候就出问题了,所以它才会从list转为linkedhashMap!
解决办法:
- 修改调用者的接口,定义接收的具体实体对象,feign 在返回时会自动转换类型;
- 项目引入 com.alibaba.fastjson 依赖包,使用 JSONObject.toJSONString() 方法 将 feign 返回的数据转成 json 字符串,再使用 JSONObject.parseArray() 将该 json 字符串 转成自己的实体类类型
两种方式经本人测试都能正确的获取到预期的数据格式,这里本人采用第二种方法,感觉比较安全且规范;
这里看到返回的 data 依旧是 “List<LinkedHashMap>”
经过 JSONObject.parseArray() 转换后,已变成我们预期的实体类集合