前面讲的一些都是简单类型,cxf都支持。但是有些复杂类型,cxf是不支持,比如常用的Map类型;

下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色信息;

服务器端:

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类:发现报错:

这个报错信息说,不支持该类型;

这里我们有好几种解决方案,这里我们用最常用的一种,使用适配器,把cxf不能接受的类型通过适配器,转能接受的类型。

我们使用@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();
}
} }

运行下:

(六)cxf处理一些Map等复杂类型的更多相关文章

  1. Map和String类型之间的转换

    前提是String的格式是map或json类型的 public static void main(String[] args) { Map<String,Object> map = new ...

  2. sql.Rows 转换为 []map[string]interface{} 类型

    // *sql.Rows 转换为 []map[string]interface{}类型 func rows2maps(rows *sql.Rows) (res []map[string]interfa ...

  3. (四)CXF之处理Map类型的数据

    一.需求描述 正常来讲webService可以处理Java 数据类型.JavaBean.List等,但是却不能处理Map数据类型.本章讲解如何使用适配器来使得web服务可以处理Map数据类型. 流程: ...

  4. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)

    本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...

  5. Golang 使用Map构建Set类型的实现方法

    前言 本篇主要给大家讲述了如何利用Go语言的语法特性实现Set类型的数据结构,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧. 需求 对于Set类型的数据结构,其实本质上跟List没什么多 ...

  6. python 练习用python六剑客实现一个统计数字的个数,六剑客:(map、lambda、reduce、filter、切片、推到列表)

    统计一共有几个数字 s="sdfa45ads46723" #lambda >>> filter(lambda x:x.isdigit(),list(s)) ['4 ...

  7. map以自定义类型当Key

    关于map的定义: template < class Key, class T, class Compare = less<Key>, class Allocator = alloc ...

  8. action访问servlet的API并且获取到MAP或者httpServlet类型的application,session,request

    public class testAction3 extends ActionSupport { private Map<String,Object> request; private M ...

  9. Java中 如何把Object类型强转成Map<String, String>类型

    首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...

随机推荐

  1. 怎样解决Myeclipse内存溢出?

    打开myeclipse 10安装目录下的myeclipse.ini文件 打开文件,将文件圈圈中的内容设置如下图: 上面是其中一种解决方案,下面介绍第二种解决方案 设置Default VM Argume ...

  2. shell提取文件后缀名,并判断其是否为特定字符串

    如果文件是 .css文件 或 .js文件,则进行处理. file=$1 if [ "${file##*.}"x = "css"x ]||[ "${fi ...

  3. Dapper总结(一)---基本CRUD操作

    一.dapper是什么 dapper是一款轻量级的ORM(Object Relationship Mapper),它负责数据库和编程语言之间的映射.SqlConnection,MysqlConnect ...

  4. C#实现虚拟控件列表显示100w个控件方法

    方法一: C#的FlowlayoutPanel添加一定数据量的控件后就会空白,通过虚拟列表方式可以解决这个问题. 1.创建一个包含ScrollPanel和滚动条的用户控件,定义一个List,添加控件时 ...

  5. Java SE 之 数据库操作工具类(DBUtil)设计

    JDBC创建数据库基本连接 //1.加载驱动程序 Class.forName(driveName); //2.获得数据库连接 Connection connection = DriverManager ...

  6. UVA - 10480 Sabotage【最小割最大流定理】

    题意: 把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边.这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点,问题是要求最小割应该隔断那条边. ...

  7. 错误RSA host key for [ip address] has changed and you have requested strict checking.

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS ...

  8. Synchronized和lock的区别和用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  9. 在iOS 开发中用GDataXML(DOM方式)解析xml文件

    因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...

  10. android handlerThread

    一.handlerThread产生的背景