OpenFeign远程服务调用返回结果时报错 ClassCastException

一开始挺纳闷,我也返回的结果怎么会是LinkedHashMap呢?我代码里也没有用LinkedHashMap封装结果呀?

上网搜了一下发现:

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

原文出处:spring cloud远程调用接口返回linkedHashMap问题

原来是这样。了解了原因之后,写个结果转换工具类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class ConvertUtil {

    /**
     * 获取指定类对象
     * @param result 远程调用结果
     * @param targetClassInstance 指定类对象实例
     * @return
     */
    public static Object getFeignResult(Object result, Object targetClassInstance) {
        ObjectMapper mapper = new ObjectMapper();  // 通过ObjectMapper获取映射
        try {
            Class<?> targetClass = Class.forName(targetClassInstance.getClass().getName());  // 获取指定对象类
            return mapper.convertValue(result, targetClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}

需要转换的时候,调用即可:

1
Student res = (Student) ConvertUtil.getFeignResult(studentService.loginByPassword(dto).getData(), new Student());
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy