(四)CXF之处理Map类型的数据

一、需求描述

  • 正常来讲webService可以处理Java 数据类型、JavaBean、List等,但是却不能处理Map数据类型。本章讲解如何使用适配器来使得web服务可以处理Map数据类型。
  • 流程:
  1. 在web服务接口类中添加@XmlJavaTypeAdapter注解

@XmlJavaTypeAdapter(MapAdapter.class)
    @WebResult(name="getRolesResult")
    public Map<String,List<Role>> getRoles();

  2. 编写适配器类

   

二、案例

  2.1  服务端

  • Role.java
public class Role {
    private Integer id;
    private String roleName;

    public Role() {
        super();
    }

    public Role(Integer id, String roleName) {
        super();
        this.id = id;
        this.roleName = roleName;
    }

   //省略getset方法 
  • User.java
public class User {
    private Integer id;
    private String userName;
    private String passWord;

//隐藏getset方法
  • 编写服务接口
package com.shyroke.service;

import java.util.List;
import java.util.Map;

import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.shyroke.bean.Role;

@WebService
public interface ILogin {

    @XmlJavaTypeAdapter(MapAdapter.class)
    @WebResult(name="getRolesResult")
    public Map<String,List<Role>> getRoles();
}
  • 编写服务接口实现类

package com.shyroke.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.jws.WebService;

import com.shyroke.bean.Role;
import com.shyroke.bean.User;

@WebService(endpointInterface = "com.shyroke.service.ILogin")
public class Login implements ILogin {

    /**
     * 获取所有用户以及对应的角色
     */
    public Map<String, List<Role>> getRoles() {
        Map<String, List<Role>> map = new HashMap<String, List<Role>>();

        List<Role> roleList1 = new ArrayList<Role>();
        roleList1.add(new Role(1, "架构师"));
        roleList1.add(new Role(2, "技术总监"));

        List<Role> roleList2 = new ArrayList<Role>();
        roleList2.add(new Role(3, "程序员"));

        map.put("张三", roleList1);
        map.put("李四", roleList2);

        return map;
    }

}
  • 编写适配器

package com.shyroke.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import com.shyroke.bean.MyRole;
import com.shyroke.bean.Role;

public class MapAdapter extends XmlAdapter<MyRole[], Map<String, List<Role>>> {

    /**
     * 适配转换 MyRole[] -> Map<String, List<Role>>
     */
    @Override
    public MyRole[] marshal(Map<String, List<Role>> roleMap) throws Exception {
        MyRole[] roles = new MyRole[roleMap.size()];

        int i = 0;
        for (String key : roleMap.keySet()) {
            roles[i] = new MyRole();
            roles[i].setKey(key);
            roles[i].setValue(roleMap.get(key));
            i++;
        }

        return roles;
    }

    /**
     * 适配转换 Map<String, List<Role>> -> MyRole[]
     */
    @Override
    public Map<String, List<Role>> unmarshal(MyRole[] roles) throws Exception {

        Map<String, List<Role>> map = new HashMap<String, List<Role>>();

        for (int i = 0; i < roles.length; i++) {
            map.put(roles[i].getKey(), roles[i].getValue());
        }

        return map;
    }

}
  • MyRole.java
/**
 * 本类用于webService的Map类型的数据转换。
 * @author Administrator
 *
 */
public class MyRole {
    private String key;
    private List<Role> value;

//隐藏getset方法
}
  • 发布服务

package com.shyroke.publish;


import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.shyroke.service.ILogin;
import com.shyroke.service.Login;

public class PublishMain {
    public static void main(String[] args) {
        
        String address="http://localhost:3333/login";
        JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
        factoryBean.setAddress(address);
        factoryBean.setServiceClass(ILogin.class);
        factoryBean.setServiceBean(new Login());
        
        factoryBean.create();
        System.out.println("服务发布.......");
        
    }
}

 

    2.2  客户端

  •  用cxf工具生成client文件

 

 

  •  测试

package com.shyroke.service;

import java.util.List;

public class Client {
    public static void main(String[] args) {
        ILogin login=new ILoginService().getILoginPort();
        MyRoleArray roles=login.getRoles();
        List<MyRole> roleList= roles.item;
        for(MyRole role:roleList) {
            System.out.println(role.getKey());
            for(Role r:role.getValue()) {
                System.out.println(r.getId()+"\t"+r.getRoleName());
            }
            System.out.println("------------------");
        }
    }
}

 

posted @ 2017-12-03 14:19  shyroke、  阅读(909)  评论(0编辑  收藏  举报
作者:shyroke 博客地址:http://www.cnblogs.com/shyroke/ 转载注明来源~