• 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写


    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 查看结果 发现成功调用




  • 相关阅读:
    HTML页面之间跳转传值
    Ajax之三种数据传输格式
    css选择器
    jQuery Validate
    正则表达式
    JSP的九大内置对象,七大动作指令,四个作用域,三个编译指令
    Zooeeper之paxos算法
    ZooKeeper之选举(fastleaderelection算法)
    ZooKeeper之ZAB协议
    ZooKeeper之三阶段提交(3PC)
  • 原文地址:https://www.cnblogs.com/duguxiaobiao/p/9128827.html
Copyright © 2020-2023  润新知