学习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.rg2.webservice.jaxws_asm.GetrolesResponse._return
        at com.rg2.webservice.jaxws_asm.GetrolesResponse

在cxf处理map类型的时候需要在接口上加注解,否则会报以上错误。

@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();
}

其中MapAdapter单独写

package com.rg2.adapter;

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

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

import com.rg2.entity.MyRole;
import com.rg2.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 role = v[i];
            map.put(role.getKey(), role.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;
    }

}
package com.rg2.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方法

没有报错,打开浏览器

如之前写的那样,将客户端使用wsdl2自动生成代码

然后通过Client类调用服务端接口

package com.rg2.webservice;

import java.util.List;

public class Client {

    public static void main(String[] args) {
        HelloWorldService service = new HelloWorldService();
        HelloWorld helloWorldPort = service.getHelloWorldPort();

        MyRoleArray getroles = helloWorldPort.getroles();
        List<MyRole> roleList = getroles.item;
        for (int i = 0; i < roleList.size(); i++) {
            MyRole my = roleList.get(i);
            System.out.print(my.key + ":");
            for (Role role : my.value) {
                System.out.print(role.getId()+","+role.getRoleName());
            }
            System.out.println("===============");
        }
    }

}

运行结果为:

原文地址:https://www.cnblogs.com/zhengyuanyuan/p/9277059.html

时间: 2024-08-29 20:45:16

学习webservice之cxf(5):cxf处理map等复杂类型的相关文章

【WebService】CXF处理javaBean等复合类型以及Map等复杂类型的数据

WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义WebService服务及其调用 [WebService]wsdl配置详解以及使用注解修改wsdl配置 在实际中除了传入一些基本的参数以外,还需要传入一些类似于javaBean等复合类型,或者Map等复杂类型的数据,这一篇博文主要来写两个demo,模拟一下CXF处理这类数据的过程. 1. CXF处理javaBean等复合类型的数据 客户端提交一个数据过去,要检查权限,比如是管

webservice的简单使用,cxf框架的的使用

Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间, 无论它们所使用的语言. 平台或内部协议是什么, 都可以相互交换数据.Web Service是自描述.

cxf处理一些Map等复杂类型

前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色信息: 服务器端: HelloWorld接口加方法: /**  * 获取所有用户以及对应的角色  * @return  */ public Map<String,List<Role>> getRoles(); HelloWorldImpl实现类加方法实现: public Map<

WebService的讲解 和 CXF 的初步使用

1. 复习准备 1.1. Schema约束 几个重要知识: namespace 相当于schema文件的id targetNamespace属性 用来指定schema文件的namespace的值 xmlns属性 引入一个约束, 它的值是一个schema文件的namespace值 schemaLocation属性 用来指定引入的schema文件的位置   schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的schema文件都需要有一个id, 但在这里它叫names

webservice发布服务:CXF及客户端调用

2.CXF:(与spring整合) CXF相对来说操作没有AXIS繁琐 1.导入spring的jar包和cxf的jar包 2.在spring的核心配置文件中配置发布的接口类 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.o

WebService通讯技术的CXF框架问题

WebService通讯技术的CXF框架问题 严重: Servlet /cxf_rs_spring threw load() exception java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet 出现原因:服务器冲突 我在pom.xml文件中既配置了jetty服务器,又配置了tomcat服务器,所以在启动的时候两个服务冲

【Apache CXF】CXF对JAX-WS的支持

相关dependency,我使用的版本是2.7.11: <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org

【Apache CXF】CXF对JAX-RS的支持

用CXF构建RESTful services有两种方式:·CXF对JAX-RS的实现.·使用JAX-WS Provider/Dispatch API.官网上还有Http Bindings方式,他需要做一些繁琐的工作去创建资源再映射到服务上,这种方式从2.6时已经被移除了.刚好我这里有几个工程都是用第一种方式实现的,在这里便主要记录一下spring+CXF构建RESTful service. 首先列举一下JAX-RS的一些常用注解.·@Path:指定资源的URI.·@Produces/@Consu

学习Webservice之入天气小试

主要方法是:通过程序中设置代理用公司内网访问外部Webservice public InputStream getSoapInputStream(String url) { InputStream inputStream = null; try { URL urlObj = new URL(url); InetSocketAddress addr = new InetSocketAddress("172.17.18.80", 8080); Proxy proxy = new Proxy