(四)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类.统 ...
随机推荐
- nginx -- 设置单点登录 sso oidc oauth
这个开源项目可以找到你想要的: https://github.com/vouch/vouch-proxy
- yarn集群8088端口被攻击挖矿
yarn集群8088端口被攻击挖矿 https://www.jianshu.com/p/a2d6b0d827ab https://blog.csdn.net/lm709409753/article/d ...
- SpringBoot中的异常处理方式
SpringBoot中有五种处理异常的方式: 一.自定义错误页面 SpringBoot默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序出现了异常SpringBoot ...
- vue-cli的eslint不加空格报错问题
//方法一.直接不启用eslint(不推荐) //找到build/webpack.base.conf.js把以下代码取消注释 { test: /\.(js|vue)$/, loader: 'eslin ...
- List三个子类的特点
List的三个子类的特点 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高. Vector: 底层数据结构是数组,查询快,增删慢. 线程安全,效率低. Vector相对A ...
- 006-多线程-集合-Set-ConcurrentSkipListSet
一.简介 ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景.ConcurrentSkipListSet和TreeSet,它们虽然都是有序的集合.但是,第一,它们的线 ...
- 自定义基于IFC数据的施工进度数据结构
<DataSource>D:/qlbz20190802.ifc</DataSource> <Datas> <Data> <ID></I ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_11-前端显示当前用户-前端请求jwt
前端代码 sessionStorage也是key/value的格式 页头显示当前用户 查询jwt nginx里面的配置 测试 开启认证服务 进行登陆 跳转到首页就应该立即请求查询. 跳转到首页 coo ...
- UIImagePickerController的用法
在实际的APP开发中,我们经常会见到应用的这样的功能 :需要选取手机相册的照片,还有选取视频,拍视频和照相的操作. 在iOS开发中,实现以上的功能就需要用到 UIImagePickerControll ...
- 【Leetcode_easy】811. Subdomain Visit Count
problem 811. Subdomain Visit Count solution: class Solution { public: vector<string> subdomain ...