一、需求描述

  • 正常来讲webService可以处理Java 数据类型、JavaBean、List等,但是却不能处理Map数据类型。本章讲解如何使用适配器来使得web服务可以处理Map数据类型。
  • 流程:
  1. 在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类型的数据的更多相关文章

  1. Play Framework常用标签list,set,如何遍历list、map类型数据

    最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...

  2. 【ibatis】IBatis返回map类型数据

    有时侯不想创建javabean,或者污染现有的javaBean对象,就需要返回Map类型的数据对象: 1)最简单的方法就是将查询到的字段,使用""进行引起来,这样就可以返回map类 ...

  3. WS之cxf处理的复杂类型(Map)

    一.服务端: 1.创建接口: package cn.tdtk.ws.dao; import java.util.List;import java.util.Map; import javax.jws. ...

  4. (六)cxf处理一些Map等复杂类型

    前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...

  5. 小白鼠排队(map容器插入数据的四种方法)

    题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...

  6. C++容器(四):map类型

    map 类型 map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而非通过元素在数组内的位置来 ...

  7. Postman 的 Post 请求方式的四种类型的数据

    Postman 的 Post 请求方式的四种类型的数据 1. form-data 2. x-www-form-urlencoded 3. raw 4. binary 1. form-data 就是 H ...

  8. CXF2.7整合spring发布webservice,返回值类型是Map和List<Map>类型

    在昨天研究了发布CXF发布webservice之后想着将以前的项目发布webservice接口,可是怎么也发布不起来,服务启动失败,原来是自己的接口有返回值类型是Map. 研究了一番之后,发现: we ...

  9. Map类型介绍与遍历

    声明:本文非原创: 在程序员开发过程中,Map有着利用率占比是非常高:很多时间我们只知其用,不知其理:写这个随笔的目的也是希望对伙伴们对Map的理解有一点帮助. 类型介绍 java自带各种Map类.统 ...

随机推荐

  1. Mac 中使用phpstorm 修改文件提示"only read",只读权限

    在终端中执行命令: 给max系统用户liutao赋予整个项目文件权限,即可成功 sudo chown -R liutao /Users/liutao/Desktop/vagrant/newprojec ...

  2. 在不切换分支的情况下,如何在all branches中快速查看指定分支,相对其他分支的状态

    假设需要查看的分支为temp 1.git show temp 通过这个可以拿到commit id 2.查看TortoiseGit的日志,左下角勾选所有分支 3.在日志界面搜索commit id,然后右 ...

  3. Django 测试开发3 数据模型models和admin管理工具

    参考:https://blog.csdn.net/weixin_44510615/article/details/89425412 1.Django模型字段常用类型: IntegerField : 整 ...

  4. main方法的详解

    格式 * public static void main(String[] args) {} 针对格式的解释 public 被jvm调用,访问权限足够大. static 被jvm调用,不用创建对象,直 ...

  5. Carve ifc failed

    Detected IFC version: IFC2X3 Warning: Sweeper::createTriangulated3DFace, carve::triangulate::incorpo ...

  6. [Vue warn]: Do not use built-in or reserved HTML elements as component id: content

    错误如下: 报错原因: 不能使用内建标签,组件不能和html标签重复. 解决办法: 把name改成mContent解决.

  7. 35个高级Python知识点总结

    原文地址:https://blog.51cto.com/xvjunjie/2156525 No.1 一切皆对象 众所周知,Java中强调“一切皆对象”,但是Python中的面向对象比Java更加彻底, ...

  8. 共享文件word / excel /ppt 被用戶自己锁定无法编辑-解決方法

    共享文件word / excel /ppt 被用戶自己鎖定無法編輯,但用戶嘗試過關閉所有文件和重啓過系統,依然無法編輯. 搜到解決方法: Just in case someone looking fo ...

  9. 好工具必须SHOW出来! NGFW下一代防火墙性能评估利器:Safire !

    2019-09-26 00:05:54 今天先起个头,后面陆续完善 NGFW下一代防火墙是什么? 我们要关注NGFW下一代防火墙的哪些指标? 为什么说NGFW的性能不好评估?现有的评估手段工具介绍? ...

  10. MyBatis框架总结

    一. MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...