fegin调用的时候数据格式转换为linkedhashmap

2023-05-16

在spring cloud项目开发中,使用fegin进行远程调用 

1、接口服务方返回类型为Map(String,Object)类型 

2、接口调用方返回值类型也是Map(String,Object) : 
这里写图片描述
3、通过fegin调用之后返回的结果为linkedHashMap类型!!!非常奇怪: 
这里写图片描述
并显示报错类型为如下: 
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.ccx.axis.entity.model.UserBean

这里不太清楚为啥通过fegin调用之后返回值类型由Map(String,Object)变成了linkedHashMap,但是需要解决这个问题,就是讲linkedHashMap中的 Object转成bean: 
具体需要如下两句话: 
ObjectMapper mapper = new ObjectMapper(); 
UserBean userBean = mapper.convertValue(resultMap.get("userBean"), UserBean.class);
 
这样就能解决问题了。但是不明白为啥通过rpc调用之后就由HashMap转成了linkedHashMap,如果有了解的,请留言,谢谢。

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

linkHashMap转实体对象

ArraryList下面的数据是linkHashMap的格式,每个linkHashMap其实是对应的数据实体类,这时我们得到这种数据格式时,无法获取数据实体类里面的字段,无法get()到,因为是linkHashMap是键值对形式存在的,这时候我们需要对按其如下方法转换

  1. List<StaffInfoBean> stafflist = (List<StaffInfoBean>) responseBean.getResult();
  2. String jsonData = JsonUtils.objectToJson(stafflist);
  3. stafflist = JsonUtils.jsonToList(jsonData, StaffInfoBean.class);

上述方法需要进行两次的转换,存在性能问题


  
  1. ParameterizedTypeReference<ResponseBean<List<StaffInfoBean>>> typeRef = new ParameterizedTypeReference<ResponseBean<List<StaffInfoBean>>>() {
  2. };
  3. ResponseEntity<ResponseBean<List<StaffInfoBean>>> responseEntity = restTemplate.exchange(Constant.STAFF_SERVICE + "/staffInfo/queryShowAllStaffInfos", HttpMethod.POST, new HttpEntity<>(staffInfoDTO), typeRef);
  4. ResponseBean<List<StaffInfoBean>> responseBean = responseEntity.getBody();
  5. List<StaffInfoBean> stafflist = responseBean.getResult();
这种方法也可以解决,只不过需要包装两层
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fegin调用的时候数据格式转换为linkedhashmap 的相关文章

随机推荐