前面讲的一些都是简单类型,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. 11、JPA-JPQL

    /** * JPQL,Java Persistence Query Language 的简称.是一种和 SQL 类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏 ...

  2. Object.keys()返回对象的属性

    <script> // 传入对象,返回属性名 let obj = { 'a': '123', 'b': '456' } console.log(Object.keys(obj)) //[& ...

  3. java 中如何声明线程安全的集合 set, map 和list【转】

    线程安全的集合 引用自 http://blog.sina.com.cn/s/blog_508938e10102v1ig.html //make thread-safe list List MyStrL ...

  4. dubbo序列化

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...

  5. PageRank简单实现中的一个错误

    在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的.这个错误也体现出我当时对PageRank算法有理解上的偏差. 这是个什么样的错误呢?是这样的: 简单实现中计算每个 ...

  6. Python写日志

    import logging import ResultFolder logger = logging.getLogger() logger.setLevel(logging.DEBUG) def C ...

  7. 不同数据库下的web.config中数据库连接字符串

    <connectionStrings> <add name="OADBConnectionString" connectionString="Data ...

  8. JavaScript之原型|typeof|instanceof

    //var 变量X --> 对象 --> 构造器 --> 原型对象 function Person(){}; var stu = new Person(); //var stu = ...

  9. luogu P1053 篝火晚会

    传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...

  10. python之join

    def aa(): print ('hh') ' print ('gg') ' print ('ff') ' c=['ss','aa','dd'] a='kk'.join(c) print (a)#s ...