CXF webService Map 适配器模式

Posted 编世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CXF webService Map 适配器模式相关的知识,希望对你有一定的参考价值。

CXF webservice 比JDK的实现强多了,直接支持了复杂类型,类,集合(先不说MAp),但是,Map的类型要支持的话,要自己写一个适配器。

其实不光是Map,有一些类CXF也不能直接支持,比如sql里面有个什么TimeStamp也要搞适配器。

 

1     写一个适配器,让他继承XmlAdapter<MyRole[], Map<String,List<Role>>>    其中前面是转换后的类型,后面是目标类型,也就是待转换的类型。

package com.java1234.adapter;

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

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

import com.java1234.entity.MyRole;
import com.java1234.entity.Role;

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;
    }

}

2     转换之后的类型是MyRole[]  ,   所以得写一个类MyRole,

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

 

3   在webService的接口里面(不是实现里面哦)加适配器注解 @XmlJavaTypeAdapter(MapAdapter.class)

package com.java1234.webservice;

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

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

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

 

以上是关于CXF webService Map 适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

cxf webservice简单应用

CXF+JAXB处理复杂数据

cxf如何创建webservice客户端

如何用java调用cxf webservice接口

webService总结——使用CXF公布和调用webService(不使用Spring)

cxf 调用webservice 时两句注解的意思