6.Web Service CXF处理一些Map等复杂类型

前面博主写的一些都是简单类型,cxf都支持。但是有些复杂类型,cxf是不支持,比如常用的Map类型;

下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色信息;

服务器端还是我们以前的项目:
这里写图片描述

在HelloWorld接口加方法:

package com.oyyp.webservice;

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

import javax.jws.WebService;

import com.oyyp.entity.Role;
import com.oyyp.entity.User;

@WebService
public interface HelloWorld {

    public String say(String str);

    public List<Role> getRoleByUser(User user);
    /**
     * 获取所有用户以及对应的角色
     * @return
     */
    public Map<String, List<Role>> getAllRoles();
}

在HelloWorldImpl实现类加方法实现:

package com.oyyp.webservice.impl;

import com.oyyp.entity.Role;
import com.oyyp.entity.User;
import com.oyyp.webservice.HelloWorld;

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

import javax.jws.WebService;

@WebService
public class HelloWorldImpl implements HelloWorld{

    public String say(String str) {
        // TODO Auto-generated method stub
        return "Hello:"+str;
    }

    public List<Role> getRoleByUser(User user) {
        List<Role> roleList=new ArrayList<Role>();
        // 模拟 直接写死
        if(user!=null){
            if(user.getUserName().equals("tom") && user.getPassWord().equals("123456")){
                roleList.add(new Role(1,"技术总监"));
                roleList.add(new Role(2,"架构师"));
            }else if(user.getUserName().equals("jack") && user.getPassWord().equals("123456")){
                roleList.add(new Role(3,"程序员"));
            }
            return roleList;
        }else{
            return null;          
        }

    }

    public Map<String, List<Role>> getAllRoles() {
        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,"架构师"));
        map.put("tom", roleList1);

        List<Role> roleList2=new ArrayList<Role>();
        roleList2.add(new Role(3,"程序员"));
        map.put("jack", roleList2);
        return map;
    }
}

然后我们启动Server类:发现报错:这个报错信息是,不支持该类型;

这里写图片描述

解决这种问题有好几种方案,我只写一种,也是我们开发常用的:使用适配器。把cxf不能接受的类型通过适配器,转能接受的类型。

我们使用@XmlJavaTypeAdapter注解,加在接口定义上,代码如下:

package com.oyyp.webservice;

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

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

import com.oyyp.entity.Role;
import com.oyyp.entity.User;

@WebService
public interface HelloWorld {

    public String say(String str);

    public List<Role> getRoleByUser(User user);
    /**
     * 获取所有用户以及对应的角色
     * @return
     */
    @XmlJavaTypeAdapter(MapAdapter.class)
    public Map<String, List<Role>> getAllRoles();
}

这里参数需要一个实现了XmlAdapter类的适配器类;

package com.oyyp.adapter;

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

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

import com.oyyp.entity.MyRole;
import com.oyyp.entity.Role;
/**     
 * Map适配器
 * @author Administrator
 * 
 * 
 * XmlAdapter<ValueType, BoundType>  从什么类型到什么类型
 *
 */
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<String, List<Role>>();
        for (int i = 0; i < v.length; i++) {
            MyRole r=v[i];
             map.put(r.getKey(), r.getValue());
        }
        return map;
    }
    /**
     * 适配转换 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;
    }   
}

这里的话XmlAdapter要加两个参数,XmlAdapter

package com.oyyp.entity;

import java.util.List;
/**
 * 自定义实体 cxf能接受
 * @author Administrator
 *
 */
public class MyRole {

    private String key;
    private List<Role> 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;
    }   
}

这样就行了。我们运行Server类,发布webservice接口:
这里写图片描述

然后就到了webservice客户端,我们用wsdl2java工具生成下最新代码,具体过程前面的博客,这里不重复讲:
这里写图片描述

我们修改下Client类:

package com.oyyp.webservice;

import java.util.List;

public class Client {

    public static void main(String[] args) {
         HelloWorldService service=new HelloWorldService();
         HelloWorld helloWorld=service.getHelloWorldPort();
      //   System.out.println(helloWorld.say("Web Service 你大爷的"));
//          User user=new User();
//          user.setUserName("jack");
//          user.setPassWord("123456");
//          List<Role> roles=helloWorld.getRoleByUser(user);
//          for (Role role : roles) {
//              System.out.println(role.getId()+"-"+role.getRoleName());
//          }
         MyRoleArray array=helloWorld.getAllRoles();
         List<MyRole> roleList=array.item;
         for (int i = 0; i < roleList.size(); i++) {
            MyRole my= roleList.get(i);
            System.out.print(my.key+"-->");
            for (Role r : my.value) {
                System.out.print(r.getId()+"-"+r.getRoleName());
            }
            System.out.println();
        }
    }
}

运行如下:
这里写图片描述

这样就实现了复杂类型的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值