学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在调用 WebService 时,有时候会遇到 CXF 无法自动转化的类型,比如一些自定义类型或者复杂类型。此时,需要手动处理类型转化。 一种常见的方式是使用 JAXB 生成的 Java 类来处理类型转化。具体实现步骤如下: 1. 使用 `wsimport` 工具生成客户端代码。假设 WebService 的 WSDL 地址为 `http://localhost:8080/HelloWebService?wsdl`,则可以使用以下命令生成客户端代码: ``` wsimport -p com.example.client http://localhost:8080/HelloWebService?wsdl ``` 这里的 `-p` 参数指定了生成的 Java 类所在的包名。 2. 在程序中导入生成的 Java 类,然后使用它来处理类型转化。例如,如果 WebService 的方法返回类型为 `com.example.server.User`,而 CXF 无法自动转化这个类型,那么可以使用生成的 `com.example.client.User` 类来代替: ```java import com.example.client.User; import com.example.client.HelloWebService; public class HelloClient { public static void main(String[] args) { // 创建 WebService 客户端 HelloWebService client = createClient(); // 调用 WebService 方法 User user = client.getUserById(1); // 转化类型 com.example.server.User serverUser = convertUser(user); // 处理 serverUser } private static HelloWebService createClient() { // 创建 JaxWsProxyFactoryBean 对象 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 设置 WebService 地址 factory.setAddress("http://localhost:8080/HelloWebService"); // 设置接口类型 factory.setServiceClass(HelloWebService.class); // 创建 WebService 代理对象 return (HelloWebService) factory.create(); } private static com.example.server.User convertUser(User user) { com.example.server.User serverUser = new com.example.server.User(); serverUser.setId(user.getId()); serverUser.setName(user.getName()); // 处理其它属性 return serverUser; } } ``` 在这个例子中,我们先调用 WebService 方法获取到一个 `com.example.client.User` 类型的对象,然后使用 `convertUser` 方法将它转化为 `com.example.server.User` 类型的对象。最后,我们可以使用 `serverUser` 对象来处理业务逻辑。 需要注意的是,这种方式需要手动处理类型转化,比较繁琐。如果类型比较复杂,也可能会出现转化错误的问题。因此,在设计 WebService 接口时,建议使用 CXF 支持的类型或者标准的数据交换格式(比如 XML、JSON 等),以避免类型转化的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值