• WebService小白学习 之 处理一些Map等复杂类型 (5)


    上篇 WebService小白学习 之 处理JavaBean以及复合类型,list

    该篇为CXF处理一些Map等复杂类型的方法。

    实现过程:

    1、在服务端项目IHelloWorld.java添加方法声明getRoles();

    package com.gx.webservice;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebService;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    import com.gx.adapter.MapAdapter;
    import com.gx.entity.Role;
    import com.gx.entity.User;
    
    @WebService
    public interface IHelloWorld {
    	
    	public String say(String str);
    	
    	public List<Role> getRoleByUser(User user);//通过用户获取角色
    	
    	@XmlJavaTypeAdapter(MapAdapter.class)
    	public Map<String, List<Role>> getRoles(); //获取所有用户以及对应的角色
    
    }
    

    2、在服务端项目创建com.gx.adapter包,创建MapAdapter.java

    package com.gx.adapter;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    import com.gx.entity.MyRole;
    import com.gx.entity.Role;
    
    /**
     * 适配器
    * @ClassName: MapAdapter 
    * @Description: 适配转换
    * @author zhoujie 
    * @date 2018年7月27日 下午7:58:46 
    * @version V1.0
     */
    public class MapAdapter extends XmlAdapter<MyRole[], Map<String, List<Role>>>{
    
    	/**
    	 * 适配转换 MyRole[] -> Map<String,List<Role>>
    	 */
    	@Override
    	public Map<String, List<Role>> unmarshal(MyRole[] v) throws Exception {
    		Map<String, List<Role>> map = new HashMap<>();
    		for (int i = 0; i < v.length; i++) {
    			MyRole r = v[i];
    			map.put(r.getKey(), r.getValue());
    		}
    		return null;
    	}
    
    	/**
    	 * 适配转换Map<String,List<Role>> ->  MyRole[]
    	 */
    	@Override
    	public MyRole[] marshal(Map<String, List<Role>> v) throws Exception {
    		MyRole[] roles = new MyRole[v.size()];
    		int i = 0;
    		for (String key : v.keySet()) {
    			roles[i] = new MyRole();
    			roles[i].setKey(key);
    			roles[i].setValue(v.get(key));
    			i++;
    		}
    		return roles;
    	}
    
    }
    

    3、在服务端项目创建com.gx.entity包,创建MyRole.java

    package com.gx.entity;
    
    import java.util.List;
    
    /**
     * 
    * @ClassName: MyRole 
    * @Description: map适配器--自定义实体
    * @author zhoujie 
    * @date 2018年7月27日 下午7:50:17 
    * @version V1.0
     */
    public class MyRole {
    	
    	private String key; //相当于map的key
    	private List<Role> value; //相当于map的value
    	
    	public String getKey() {
    		return key;
    	}
    	public void setKey(String key) {
    		this.key = key;
    	}
    	public List<Role> getValue() {
    		return value;
    	}
    	public void setValue(List<Role> value) {
    		this.value = value;
    	}
    	
    }
    

    4、在服务端项目HelloWorldImpl.java添加方法实现getRoles();

    package com.gx.webservice.impl;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebService;
    
    import com.gx.entity.Role;
    import com.gx.entity.User;
    import com.gx.webservice.IHelloWorld;
    
    @WebService
    public class HelloWorldImpl implements IHelloWorld{
    
    	public String say(String str) {
    		return "hello "+str;
    	}
    
    	@Override
    	public List<Role> getRoleByUser(User user) {
    		//模拟 数据
    		List<Role> rolelist = new ArrayList<>();
    		if(user!=null){
    			if(user.getUsername().equals("sa") && user.getPassword().equals("123")){
    				rolelist.add(new Role(1, "技术总监"));
    				rolelist.add(new Role(2, "架构师"));
    			}else if(user.getUsername().equals("zj") && user.getPassword().equals("123")){
    				rolelist.add(new Role(3, "程序员"));
    			}
    		}
    		return rolelist;
    	}
    
    	@Override
    	public Map<String, List<Role>> getRoles() {
    		//模拟 数据
    		Map<String, List<Role>> map = new HashMap<>();
    		List<Role> rolelist = new ArrayList<>();
    		rolelist.add(new Role(1, "技术总监"));
    		rolelist.add(new Role(2, "架构师"));
    		map.put("sa", rolelist);
    		List<Role> rolelist2 = new ArrayList<>();
    		rolelist2.add(new Role(3, "程序员"));
    		map.put("zj", rolelist2);
    		return map;
    	}
    
    }
    

    5、客户端项目重新使用cxf工具生成文件,忘记请看这里

    6、客户端测试Client.java

    package com.gx.webservice;
    
    import java.util.List;
    
    public class Client {
    	
    	public static void main(String[] args) {
    		
    		IHelloWorldService service = new IHelloWorldService();
    		IHelloWorld helloworld = service.getIHelloWorldPort();
    		//System.out.println(helloworld.say("zj"));
    		
    		/*User user = new User();
    		user.setUsername("sa");
    		user.setPassword("123");
    		List<Role> rolelist = helloworld.getRoleByUser(user);
    		for (Role role : rolelist) {
    			System.out.println(role.getId()+","+role.getRoleName());
    		}*/
    		
    		MyRoleArray array = helloworld.getRoles();
    		List<MyRole> roleList = array.item;
    		for (MyRole myRole : roleList) {
    			System.out.print(myRole.key+":");
    			for (Role role : myRole.value) {
    				System.out.print(role.getId()+","+role.getRoleName());
    			}
    			System.out.println("=================");
    		}
     		
    	}
    	
    }
    

    结果:

    下篇

    WebService小白学习 之 CXF添加拦截器,自定义拦截器

  • 相关阅读:
    智能指针(shared_ptr,unique_ptr)和动态分配的数组
    C++智能指针如何指向数组
    c++20智能指针支持数组创建
    5种创建指向数组的智能指针shared_ptr/unique_ptr的方法
    ffmpeg取rtsp流,打印音视频的ts
    H.264 视频编解码技术分享AnnexB 和 avcC
    H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
    go 锁的使用
    ffmpeg中新的BitStreamFilter(h264_mp4toannexb、aac_adtstoasc等)的使用方法
    反恶意软件扫描接口(AMSI)基础知识——amsi是专门针对混淆绕过的无文件攻击脚本,在Windows 10 和Windows Server 2016 之后才有的,然后并不是所有的杀毒软件都可以调用amsi接口。国内的基本不可以!我晕!
  • 原文地址:https://www.cnblogs.com/qq1995/p/10358986.html
Copyright © 2020-2023  润新知