(四)CXF之处理Map类型的数据
一、需求描述
- 正常来讲webService可以处理Java 数据类型、JavaBean、List等,但是却不能处理Map数据类型。本章讲解如何使用适配器来使得web服务可以处理Map数据类型。
- 流程:
在web服务接口类中添加@XmlJavaTypeAdapter注解
@XmlJavaTypeAdapter(MapAdapter.class)
@WebResult(name="getRolesResult")
public Map<String,List<Role>> getRoles();
2. 编写适配器类
二、案例
2.1 服务端
- Role.java
public class Role {
private Integer id;
private String roleName;
public Role() {
super();
}
public Role(Integer id, String roleName) {
super();
this.id = id;
this.roleName = roleName;
}
//省略getset方法
}
- User.java
public class User {
private Integer id;
private String userName;
private String passWord;
//隐藏getset方法
}
编写服务接口
package com.shyroke.service; import java.util.List;
import java.util.Map; import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.shyroke.bean.Role; @WebService
public interface ILogin { @XmlJavaTypeAdapter(MapAdapter.class)
@WebResult(name="getRolesResult")
public Map<String,List<Role>> getRoles();
}
编写服务接口实现类
package com.shyroke.service; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.jws.WebService; import com.shyroke.bean.Role;
import com.shyroke.bean.User; @WebService(endpointInterface = "com.shyroke.service.ILogin")
public class Login implements ILogin { /**
* 获取所有用户以及对应的角色
*/
public Map<String, List<Role>> getRoles() {
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, "技术总监")); List<Role> roleList2 = new ArrayList<Role>();
roleList2.add(new Role(3, "程序员")); map.put("张三", roleList1);
map.put("李四", roleList2); return map;
} }
编写适配器
package com.shyroke.service; import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.shyroke.bean.MyRole;
import com.shyroke.bean.Role; public class MapAdapter extends XmlAdapter<MyRole[], Map<String, List<Role>>> { /**
* 适配转换 MyRole[] -> Map<String, List<Role>>
*/
@Override
public MyRole[] marshal(Map<String, List<Role>> roleMap) throws Exception {
MyRole[] roles = new MyRole[roleMap.size()]; int i = 0;
for (String key : roleMap.keySet()) {
roles[i] = new MyRole();
roles[i].setKey(key);
roles[i].setValue(roleMap.get(key));
i++;
} return roles;
} /**
* 适配转换 Map<String, List<Role>> -> MyRole[]
*/
@Override
public Map<String, List<Role>> unmarshal(MyRole[] roles) throws Exception { Map<String, List<Role>> map = new HashMap<String, List<Role>>(); for (int i = 0; i < roles.length; i++) {
map.put(roles[i].getKey(), roles[i].getValue());
} return map;
} }
- MyRole.java
/**
* 本类用于webService的Map类型的数据转换。
* @author Administrator
*
*/
public class MyRole {
private String key;
private List<Role> value; //隐藏getset方法
}
发布服务
package com.shyroke.publish; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.shyroke.service.ILogin;
import com.shyroke.service.Login; public class PublishMain {
public static void main(String[] args) { String address="http://localhost:3333/login";
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress(address);
factoryBean.setServiceClass(ILogin.class);
factoryBean.setServiceBean(new Login()); factoryBean.create();
System.out.println("服务发布......."); }
}

2.2 客户端
用cxf工具生成client文件


测试
package com.shyroke.service;
import java.util.List;
public class Client {
public static void main(String[] args) {
ILogin login=new ILoginService().getILoginPort();
MyRoleArray roles=login.getRoles();
List<MyRole> roleList= roles.item;
for(MyRole role:roleList) {
System.out.println(role.getKey());
for(Role r:role.getValue()) {
System.out.println(r.getId()+"\t"+r.getRoleName());
}
System.out.println("------------------");
}
}
}

(四)CXF之处理Map类型的数据的更多相关文章
- Play Framework常用标签list,set,如何遍历list、map类型数据
最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...
- 【ibatis】IBatis返回map类型数据
有时侯不想创建javabean,或者污染现有的javaBean对象,就需要返回Map类型的数据对象: 1)最简单的方法就是将查询到的字段,使用""进行引起来,这样就可以返回map类 ...
- WS之cxf处理的复杂类型(Map)
一.服务端: 1.创建接口: package cn.tdtk.ws.dao; import java.util.List;import java.util.Map; import javax.jws. ...
- (六)cxf处理一些Map等复杂类型
前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...
- 小白鼠排队(map容器插入数据的四种方法)
题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...
- C++容器(四):map类型
map 类型 map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而非通过元素在数组内的位置来 ...
- Postman 的 Post 请求方式的四种类型的数据
Postman 的 Post 请求方式的四种类型的数据 1. form-data 2. x-www-form-urlencoded 3. raw 4. binary 1. form-data 就是 H ...
- CXF2.7整合spring发布webservice,返回值类型是Map和List<Map>类型
在昨天研究了发布CXF发布webservice之后想着将以前的项目发布webservice接口,可是怎么也发布不起来,服务启动失败,原来是自己的接口有返回值类型是Map. 研究了一番之后,发现: we ...
- Map类型介绍与遍历
声明:本文非原创: 在程序员开发过程中,Map有着利用率占比是非常高:很多时间我们只知其用,不知其理:写这个随笔的目的也是希望对伙伴们对Map的理解有一点帮助. 类型介绍 java自带各种Map类.统 ...
随机推荐
- 用Fiddler模拟低速网络环境(弱网)
原文链接:http://caibaojian.com/fiddler.html 有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」 甚至当网路速度慢,会 ...
- TynSerial基本数据类型序列(还原)
TynSerial基本数据类型序列(还原) procedure TForm1.ToolButton17Click(Sender: TObject); var serial: TynSerial; be ...
- TynSerial结构体序列(还原)
TynSerial结构体序列(还原) 1)定义一个结构体 type TRec = record id, name: string; end; 2)结构体序列(还原) procedure TForm1. ...
- PHPStorm 快捷键大全(Win/Linux/Mac)
下面的-符号记得改成 ‘`’,markdown 语法会转义.使用频率是我自己为准.仅供参考 Mac 符号 符号 解释 ⌘ Command ⇧ Shift ⌃ Control ↩ Enter/Ret ...
- 关于路由跟踪指令---traceroute
我们都用过ping命令来检查主机与目标地址是否连通,自己的主机与目标地址的通讯包通讯速率,所谓的通讯包也就是那些什么TCP/IP,UDP包. 原理:https://www.cnblogs.com/be ...
- python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...
- java中把文件拷贝到指定目录下最简单几种方法
java中把文件拷贝到指定目录下最简单几种方法 String savePath = "D:/file";// 文件保存到d盘的file目录下 File savefile = n ...
- PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)
1048 Find Coins (25 分) Eva loves to collect coins from all over the universe, including some other ...
- 将任意音频格式文件转换成16K采样率16bit的wav文件
此转换需要使用ffmpeg 假设有目录 d:\录音 目录有 张三.m4a, 李四.m4a xxx.m4a(其他任意格式音频触类旁通可以把 *.m4a改成*.*).批量转换成采样率16K,有符号,16b ...
- spring mvc框架+ ajax实现 文件上传
1.前端页面,通过form表单提交,必须设置 enctype="multipart/form-data" 代表form表单在发送到服务器时候编码方式是二进制类型,一般用于图片.mp ...