一、需求描述

  • 正常来讲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("------------------");
}
}
}

最新文章

  1. linux下使用adb连接android手机
  2. hibernate学习(6)——加载策略(优化)
  3. javascript中字符串的常用方法
  4. Verilog之基本算数运算
  5. 前端经常使用插件使用文档 以及demo
  6. MyBatis自定义数据映射TypeHandler
  7. asp.net BulletedList样式修改 css
  8. POJ Octal Fractions(JAVA水过)
  9. 用DELPHI的RTTI实现对象的XML持久化
  10. hdu 1384 Intervals
  11. 关于UIView及其子类重绘drawRect
  12. [Swift]LeetCode415. 字符串相加 | Add Strings
  13. ERC20 token standard issues.
  14. OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
  15. kafka学习指南(总结版)
  16. DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)
  17. webug4.0安装
  18. 使用python实现解析二元一次方程
  19. json 数组
  20. JS对象与PHP对象的对比

热门文章

  1. 到达型01背包---P1504 积木城堡
  2. 安卓P2P开源项目
  3. C# 将文本写入到文件
  4. $().attr() 和 $().css的区别
  5. POPUP_GET_VALUES 金额字段不可编辑
  6. 开始学习Docker啦--容器理论知识(一)
  7. HTML中,a href =&quot; &quot;和 a href =&quot;#&quot;的区别
  8. windows服务器入门 php的安装
  9. linux下使用Vsftpd服务传输文件
  10. PHP判断是不是爬虫的方法