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();
}
时间: 2024-10-13 16:30:47

CXF webService Map 适配器模式的相关文章

学习webservice之cxf(5):cxf处理map等复杂类型

Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.util.List是接口, 而 JAXB 无法处理接口. this problem is related to the following location: at java.util.List at private java.util.Map com.r

Apache CXF 整合 Map

在进行编码前有必要对一些基本的认识进行介绍,以便后面的讲解. 1.JAXB: JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类.JAXB允许JAVA人员将JAVA类映射为XML表示方式,常用的注解包括:@XmlRootElement,@XmlElement等等. JAXB(Java Architecture for XML Bin

CXF WebService整合SpringMVC的maven项目

首先推荐博客:http://www.cnblogs.com/xdp-gacl/p/4259481.html   http://blog.csdn.net/hu_shengyang/article/details/38384597 CXF是webService技术的一种实现工具,为什么用CXF来实现webService: 1.      Java的webService实现本身就是一个很耗性能的实现方案(xml与java对象之间在服务端以及客户端的互转比较消耗性能): 2.      目前java主

CXF webservice完整例子

Web Service技术应用广泛,可实现不同平台的数据交换,现做了一个CXF webservice小例子,供webservice初学者参考. 1.环境搭建 1.1  下载 Apache CXF  可以去官方下载 http://cxf.apache.org/ .也可点击http://pan.baidu.com/s/1jIPyOYU 我分享的云盘下载(apache-cxf-2.4.2).  解压文件 1.2  配置Apache CXF环境变量: 创建一个CXF_HOEM变量,值为CXF框架所在根目

java调用CXF WebService接口的两种方式

通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();        // 判断是否抛出异常        factory.getOutInterceptors().add(new LoggingInIntercept

Cxf WebService实战

在前一篇转载的关于cxf webservice的实现思路中向大家介绍了实现webservice的思路,但并没有给出具体的实现代码,在本文中我将通过介绍借助于spring实现webservice的方式,在本文中同时将向大家介绍在我实现的过程中遇到的一些问题. 1.搭建webservice服务端: (1.1)新建java web工程,同时在web.xml中进行spring的相关配置,如下: <?xml version="1.0" encoding="UTF-8"?

CXF WebService整合Spring

转自http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html 首先,CXF和spring整合需要准备如下jar包文件: 这边我是用Spring的jar包是Spring官方提供的,并没有使用CXF中的Spring的jar文件. 添加这么多文件后,首先在web.xml中添加如下配置: <!-- 加载Spring容器配置 --> <listener> <listener-class>org.springframe

cxf WebService整理

项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制. 安全认证采用的是WSS4J,日志记录和异常处理采用拦截器控制, 资源下载:客户端和服务端都点这 服务端 整体架构. 至于webservice的配置可以参考其他文档, 服务接口 package com.cxfdemo.ws.service; import java.util.List; import javax.jws.WebParam; import javax.jws.WebRes

cxf webservice简单应用

Server端 server部署到一个端口号为80的tomcat中 CXFController.java package com.lwj.controller; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotati