背景
今天刚好有需求需要用到dubbo的泛化调用,涉及到了泛型问题:服务端无法获取泛型对象的数据,特此记录。
public Response add(Department<Person[]> department, UserInfo userName, List<Person> test);
解决方式
Department对象包含Person对象,按照普通方式调用服务将无法获取对象:
genericService.$invoke("add", new String[] {"com.xxx.Department","com.xxx..UserInfo","java.util.List"},
new Object[] {null,null,null});
所以通过Map的形式指定泛型类型,
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", 1);
//指定当前对象的类型
data.put("class", "com.xxx.Department");
//这是子属性,所以class定义的也是子属性的类型
Map<String, Object> person = new HashMap<String, Object>();
person.put("class","com.xxx.Person");
person.put("name", "TEST");
data.put("data", person);
//调用成功
genericService.$invoke("add",new String[] {"com.xxx.Department",
"com.xxx.UserInfo","java.util.List"}
, new Object[]{data,null,null});
需要注意的是,记得在泛化调用时,在ReferenceConfig
中打开泛型:
reference.setGeneric(true);
官方文档:https://dubbo.gitbooks.io/dubbo-user-book/demos/generic-reference.html