(四)CXF之处理Map类型的数据
2024-09-01 09:54:47
一、需求描述
- 正常来讲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("------------------");
}
}
}
最新文章
- linux下使用adb连接android手机
- hibernate学习(6)——加载策略(优化)
- javascript中字符串的常用方法
- Verilog之基本算数运算
- 前端经常使用插件使用文档 以及demo
- MyBatis自定义数据映射TypeHandler
- asp.net BulletedList样式修改 css
- POJ Octal Fractions(JAVA水过)
- 用DELPHI的RTTI实现对象的XML持久化
- hdu 1384 Intervals
- 关于UIView及其子类重绘drawRect
- [Swift]LeetCode415. 字符串相加 | Add Strings
- ERC20 token standard issues.
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
- kafka学习指南(总结版)
- DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)
- webug4.0安装
- 使用python实现解析二元一次方程
- json 数组
- JS对象与PHP对象的对比
热门文章
- 到达型01背包---P1504 积木城堡
- 安卓P2P开源项目
- C# 将文本写入到文件
- $().attr() 和 $().css的区别
- POPUP_GET_VALUES 金额字段不可编辑
- 开始学习Docker啦--容器理论知识(一)
- HTML中,a href ="; ";和 a href =";#";的区别
- windows服务器入门 php的安装
- linux下使用Vsftpd服务传输文件
- PHP判断是不是爬虫的方法