(六)cxf處理一些Map等複雜類型

前面講的一些都是簡單類型,cxf都支持。可是有些複雜類型,cxf是不支持,好比經常使用的Map類型;java

 

下面咱們在前面的實例基礎上在加一個方法,好比咱們如今有個需求,獲取全部用用戶以及對應的每一個用戶全部角色信息;程序員

 

服務器端:web

 

HelloWorld接口加方法:數組

    /**
     *     獲取全部用戶以及對應的角色
     * @return
     */
    public Map<String,List<Role>> getRoles();

 

HelloWorldImpl實現類加方法實現:服務器

    public Map<String, List<Role>> getRoles() {
        // TODO Auto-generated method stub
        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("wishwzp", roleList1);
        List<Role> roleList2=new ArrayList<Role>();
        roleList2.add(new Role(1,"程序員"));
        map.put("jack", roleList2);
        return map;
    }

 

而後咱們啓動Server類:發現報錯:架構

這個報錯信息說,不支持該類型;eclipse

 

這裏咱們有好幾種解決方案,這裏咱們用最經常使用的一種,使用適配器,把cxf不能接受的類型經過適配器,轉能接受的類型。ide

 

咱們使用@XmlJavaTypeAdapter註解,加在接口定義上,完整接口代碼以下:工具

package com.wishwzp.webservice;

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

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

import com.wishwzp.adapter.MapAdapter;
import com.wishwzp.entity.Role;
import com.wishwzp.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>> getRoles();
}

 

這裏參數須要一個實現了XmlAdapter類的適配器類;測試

package com.wishwzp.adapter;

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

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

import com.wishwzp.entity.MyRole;
import com.wishwzp.entity.Role;

/**
 * Map適配器
 * @author Administrator
 *
 */
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<ValueType,BoundType> 

ValueType是cxf能接收的類型,這裏我用了數組;

BoundType是cxf不能接受的類型,也就是我例子裏的需求的Map類型;

 

這裏你們會看到,還有一個MyRole自定義類型,key:value。咱們搞成兩個屬性,具體實現以下:

package com.wishwzp.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;
    }
    
    
}

 

 

OK 這樣就好了。咱們運行Server類,發佈webservice接口:

而後就到了webservice客戶端,咱們用wsdl2java工具生成下最新代碼,具體過程前面講過,這裏不重複講:

個人地址是:D:\eclipse_workspace\WS_Client\src\main\java 大家的可能和我不同:

而後咱們進入dos,進入上面的本地硬盤地址,而後執行命令:wsdl2java http://192.168.0.110/helloWorld?wsdl

 

生成代碼以下:

 

咱們修改下Client類:

package com.wishwzp.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("wishwzp測試"));
//        User user=new User();
//        user.setUserName("jack");
//        user.setPassword("123456");
//        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(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();
        }
    }

}

 

運行下:

相關文章
相關標籤/搜索