1. 首先我们按照List或数组等处理方式来处理Map,看看效果
1.1 在服务端的接口中添加以下方法
/** * 查询所有班级信息加上对应的学生列表 * * @return */ public Map<String, List<User>> findAllUsers();1.2 在实现类中模拟数据库访问实现
@Override public Map<String, List<User>> findAllUsers() { Map<String, List<User>> map = new HashMap<>(); List<User> users1 = new ArrayList<>(); users1.add(new User(1, "aa", 1)); users1.add(new User(2, "bb", 1)); map.put("1班", users1); List<User> users2 = new ArrayList<>(); users2.add(new User(3, "cc", 2)); map.put("2班", users2); return map; }1.3 发布 看结果
1.4 结论:CXF只支持String,基本数据类型,JavaBean类型,List集合,数组的转化,不支持Map及非JavaBean的类型的转换。
2. 解决CXF不能处理Map的方法
解决思路就是 将 Map通过适配器 转成 cxf可以处理的数据类型
2.1 在服务端的接口中指定方法上添加注解 @XmlJavaTypeAdapter(value = MapAdapter.class),例如如下:
/** * 查询所有班级信息加上对应的学生列表 * * @return */ @XmlJavaTypeAdapter(value = MapAdapter.class) public Map<String, List<User>> findAllUsers();这里的 类MapAdapter 是 用来进行编排和编排的
2.2 创建和实现转换类
package com.lonely.adapter; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.lonely.pojo.MyClass; import com.lonely.pojo.User; public class MapAdapter extends XmlAdapter<MyClass[], Map<String, List<User>>> { @Override public Map<String, List<User>> unmarshal(MyClass[] v) throws Exception { Map<String, List<User>> map = new HashMap<>(); for (MyClass myClass : v) { map.put(myClass.getKey(), myClass.getValue()); } return map; } @Override public MyClass[] marshal(Map<String, List<User>> v) throws Exception { MyClass[] myClasses = new MyClass[v.size()]; int i = 0; for (String key : v.keySet()) { myClasses[i] = new MyClass(); myClasses[i].setKey(key); myClasses[i].setValue(v.get(key)); i++; } return myClasses; } }在这里用到了 MyClass[] ,MyClass是对我们的Map数据做得一个封装,里面实际上跟map一样。有key和value
2.3 自定义bean MyClass
package com.lonely.pojo; import java.util.List; /** * map转换的 自定义bean * * @author 15072 * */ public class MyClass { private String key; private List<User> value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public List<User> getValue() { return value; } public void setValue(List<User> value) { this.value = value; } public MyClass() { super(); // TODO Auto-generated constructor stub } public MyClass(String key, List<User> value) { super(); this.key = key; this.value = value; } }2.4 至此,在来发布,发现发布成功,下面就是客户端调用测试
3. 客户端调用测试
3.1 编写测试
package com.lonely.client; import java.util.List; import com.lonely.server.HelloWs; import com.lonely.server.HelloWsService; import com.lonely.server.MyClass; import com.lonely.server.MyClassArray; import com.lonely.server.User; public class HelloInvoking { public static void main(String[] args) { HelloWsService helloWsService = new HelloWsService(); HelloWs helloWs = helloWsService.getHelloWsPort(); // System.out.println(helloWs.sayHelloWs("dugu")); /* * Clazz clazz = new Clazz(); clazz.setClassId(1); List<User> list = * helloWs.findUsersByClassId(clazz); for (User user : list) { * System.out.println(user.getUsername() + ":" + user.getClassId()); } */ MyClassArray myClassArray = helloWs.findAllUsers(); List<MyClass> list = myClassArray.getItem(); for (MyClass myClass : list) { System.out.println("班级:" + myClass.getKey()); List<User> users = myClass.getValue(); for (User user : users) { System.out.println(" 学生:" + user.getUsername()); } } } }3.2 查看结果 发现成功调用