使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
1. 首先我们按照List或数组等处理方式来处理Map,看看效果
/**
* 查询所有班级信息加上对应的学生列表
*
* @return
*/
public Map<String, List<User>> findAllUsers();
1.2 在实现类中模拟数据库访问实现
@Override
public Map<String, List<User>> findAllUsers() {
Map<String, List<User>> map = new HashMap<>();
List<User> users1 = new ArrayList<>();
users1.add(new User(1, "aa", 1));
users1.add(new User(2, "bb", 1));
map.put("1班", users1); List<User> users2 = new ArrayList<>();
users2.add(new User(3, "cc", 2));
map.put("2班", users2); return map;
}
1.3 发布 看结果
1.4 结论:CXF只支持String,基本数据类型,JavaBean类型,List集合,数组的转化,不支持Map及非JavaBean的类型的转换。
2. 解决CXF不能处理Map的方法
/**
* 查询所有班级信息加上对应的学生列表
*
* @return
*/
@XmlJavaTypeAdapter(value = MapAdapter.class)
public Map<String, List<User>> findAllUsers();
这里的 类MapAdapter 是 用来进行编排和编排的
package com.lonely.adapter; import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.lonely.pojo.MyClass;
import com.lonely.pojo.User; public class MapAdapter extends XmlAdapter<MyClass[], Map<String, List<User>>> { @Override
public Map<String, List<User>> unmarshal(MyClass[] v) throws Exception {
Map<String, List<User>> map = new HashMap<>();
for (MyClass myClass : v) {
map.put(myClass.getKey(), myClass.getValue());
}
return map;
} @Override
public MyClass[] marshal(Map<String, List<User>> v) throws Exception {
MyClass[] myClasses = new MyClass[v.size()];
int i = 0;
for (String key : v.keySet()) {
myClasses[i] = new MyClass();
myClasses[i].setKey(key);
myClasses[i].setValue(v.get(key));
i++;
}
return myClasses;
} }
在这里用到了 MyClass[] ,MyClass是对我们的Map数据做得一个封装,里面实际上跟map一样。有key和value
package com.lonely.pojo; import java.util.List; /**
* map转换的 自定义bean
*
* @author 15072
*
*/
public class MyClass { private String key;
private List<User> value; public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} public List<User> getValue() {
return value;
} public void setValue(List<User> value) {
this.value = value;
} public MyClass() {
super();
// TODO Auto-generated constructor stub
} public MyClass(String key, List<User> value) {
super();
this.key = key;
this.value = value;
} }
2.4 至此,在来发布,发现发布成功,下面就是客户端调用测试
3. 客户端调用测试
package com.lonely.client; import java.util.List; import com.lonely.server.HelloWs;
import com.lonely.server.HelloWsService;
import com.lonely.server.MyClass;
import com.lonely.server.MyClassArray;
import com.lonely.server.User; public class HelloInvoking { public static void main(String[] args) {
HelloWsService helloWsService = new HelloWsService();
HelloWs helloWs = helloWsService.getHelloWsPort();
// System.out.println(helloWs.sayHelloWs("dugu")); /*
* Clazz clazz = new Clazz(); clazz.setClassId(1); List<User> list =
* helloWs.findUsersByClassId(clazz); for (User user : list) {
* System.out.println(user.getUsername() + ":" + user.getClassId()); }
*/ MyClassArray myClassArray = helloWs.findAllUsers();
List<MyClass> list = myClassArray.getItem();
for (MyClass myClass : list) {
System.out.println("班级:" + myClass.getKey());
List<User> users = myClass.getValue();
for (User user : users) {
System.out.println("\t学生:" + user.getUsername());
}
}
}
}
3.2 查看结果 发现成功调用
使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写的更多相关文章
- 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写
1. 在原服务端项目 ws_server中添加两个bean 1.1 添加两个类 User 和 Clazz package com.lonely.pojo; public class User { ...
- 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...
- 使用CXF开发WebService程序的总结(六):结合拦截器使用
1. 使用CXF提供的拦截器 拦截器在我看来分为两端两向,两端分为:客户端和服务端,两向(方向)分为:进(in)和出(out),即大致四类拦截器. 在这里利用cxf提供的 日志拦截器举例 1.1 在服 ...
- 使用CXF开发WebService程序的总结(三):创建webservice客户端
1.创建一个maven子工程 ws_client,继承父工程 1.1 修改父工程pom配置 <modules> <module>ws_server</module> ...
- 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例
通过该demo,可以 熟悉下 spring+cxf+maven+mybatis+mysql等常见后端技术整合 1. 在前面的 父工程 ws_parent 中 添加依赖 由于原来的项目是使用的cxf依赖 ...
- 使用GSoap开发WebService客户端与服务端
Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现, 从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多. 用gsoap开发web service的大致思路 我 ...
- 【WebService】使用CXF开发WebService(四)
CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承了 Celtix ...
- 3.使用CXF开发webService
CXF 简介 关于 Apache CXF Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache ...
- struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例
Cxf + Spring+ myeclipse+ cxf 进行 Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...
随机推荐
- vue项目内嵌入到app input type=file 坑(文件上传插件)
w问题描述: 我用vue-cli完成的一个移动端项目,内嵌到app当中,用原生的input type=file 来完成文件上传.在安卓下没有问题但是在苹果手机 上传第二次手机就会发生白屏 并无缘无故跳 ...
- LeetCode 15. 三数之和(3Sum)
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...
- 二、linux下apache2.2.11+php5.6.3的环境配置
参考文献:http://www.92csz.com/study/linux/16.htm 本节部分操作会直接使用上一节(http://www.cnblogs.com/yxpblog/p/4627509 ...
- 展示组件(Presentational component)和容器组件(Container component)之间有何不同
展示组件关心组件看起来是什么.展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态.(子组件)容器组件则更关心组件 ...
- react native props上存在的属性,显示不存在
问题:类型“Readonly<{}> & Readonly<{ children?: ReactNode; }>”上不存在属性“navigation”.ts(2339) ...
- leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)
House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...
- Linux_Ubuntu命令概述
1.命令使用方法 Linux命令格式: command [-options] [parameter1] … 说明: command: 命令名,相应功能的英文单词或单词的缩写 [-options]:选项 ...
- 无法在WEB服务器上启动调试,Web 服务器配置不正确
访问IIS元数据库失败 思考可能是次序出了问题,解决 1.打开CMD,进入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 2.输入 aspnet_regi ...
- WPF 使用Task代替ThreadPool和Thread
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...
- apache配置静态缓存
配置静态缓存:节省带宽,加快访问速度,提高用户体验.<IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif &q ...