Web Service学习之六:CXF解决无法处理的数据类型
CXF不能够处理像Map复杂的数据类型,需要单独转换处理。
总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型:
步骤:
一、创建一个可以处理的类型 举例:要转换Map<String,User>
package ws; import java.util.List; public class StringUser
{
public static class Entry
{
private String key;
private User value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public User getValue() {
return value;
}
public void setValue(User value) {
this.value = value;
}
}
private List<Entry> values;
public List<Entry> getValues() {
return values;
}
public void setValues(List<Entry> values) {
this.values = values;
} }
二、创建一个转换器,需要继承抽象类XmlAdapter<ValueType,BoundType>,其中ValueType是可以处理的类型 BoundType是不能处理的类型
package ws; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import ws.StringUser.Entry; /**
* 该转换器负责将StringUser 与 Map<String, User>进行转换
* 其中第一个参数StringUser是CXF可以处理的类型
* 第二个参数 Map<String, User> 是CXF不能处理的类型*/
public class FKXmlAdapter extends XmlAdapter<StringUser, Map<String, User>>
{ /**
* 将StringUser 转换成 Map<String, User>
*/
@Override
public Map<String, User> unmarshal(StringUser v) throws Exception
{
Map<String, User> map = new HashMap<String, User>();
for (Entry u : v.getValues())
{
map.put(u.getKey(), u.getValue());
}
return map;
} /**
* 将 Map<String, User> 转换成 StringUser
*/
@Override
public StringUser marshal(Map<String, User> v) throws Exception
{
StringUser u = new StringUser();
List<Entry> list = new ArrayList<Entry>(); for (String key : v.keySet())
{
Entry e = new Entry();
e.setKey(key);
e.setValue(v.get(key));
list.add(e);
} u.setValues(list);
return u;
} }
三、Web Service中定义该方法 需要使用注解 @XmlJavaTypeAdapter(value=FKXmlAdapter.class)注明返回值对应的处理转换器
@WebMethod(operationName="getSecUsers")
@WebResult(name="returninfo")
public @XmlJavaTypeAdapter(value=FKXmlAdapter.class) Map<String, User> getSecUsers();
四、测试如下 查看WSDL文档 返回数据类型均为可解析的类型

服务端实现类:
package ws.impl; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.jws.WebService; import ws.HelloWordI;
import ws.User; /**
* 类说明
* @author wangjunyu
* @createDate 2016-7-10 上午10:59:27
* @version V1.0
*/
@WebService(endpointInterface="ws.HelloWordI",serviceName="HelloWordImpl")
public class HelloWordImpl implements HelloWordI
{ public String sayHi(String name)
{
return name+",你好,当前时间是:"+new Date();
} public List<User> getUsers(User user)
{
System.out.println("测试:"+user.getName());
List<User> list = new ArrayList<User>();
User u1 = new User();
u1.setId("1");
u1.setName("小明");
list.add(u1);
User u2 = new User();
u2.setId("2");
u2.setName("雪梅");
list.add(u2);
return list;
} @Override
public Map<String, User> getSecUsers()
{
Map<String,User> map = new HashMap<String,User>();
User u1 = new User();
u1.setId("1");
u1.setName("小明");
map.put("一", u1); User u2 = new User();
u2.setId("2");
u2.setName("小红");
map.put("二", u2); return map;
} }
package ws;
import javax.xml.ws.Endpoint;
import ws.impl.HelloWordImpl;
public class ServerMain {
public static void main(String[] args)
{
HelloWordI hw = new HelloWordImpl();
Endpoint.publish("http://192.168.0.104/test", hw);
System.out.println("WebService 暴露成功!");
}
}
客户端打印:
package ws;
import java.util.List;
import ws.impl.HelloWordImpl;
public class ClientMain {
/**
* @param args
*/
public static void main(String[] args)
{
StringUser u = hw.getSecUsers();
System.out.println(u.getValues().get(0).getValue().getName());
System.out.println(u.getValues().get(1).getValue().getName());
}
}
Web Service学习之六:CXF解决无法处理的数据类型的更多相关文章
- Web Service学习-CXF开发Web Service实例demo(一)
Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...
- Web Service学习笔记:动态调用WebService
原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...
- Web Service学习-CXF开发Web Service的权限控制(二)
Web Service怎样进行权限控制? 解决思路:server端要求input消息总是携带实username.password信息,假设没实username和password信息.直接拒绝调用 解决 ...
- Web Service学习之一:Web Service原理
一.定义 Web Service 不是框架也不是技术 而是解决远程调用.跨平台调用.跨语言调用问题的一种规范. 二.应用1.同一个公司新.旧系统的整合:比如CRM系统与OA.客服系统相互调用2.不同公 ...
- Java Restful Web Service 学习指南
Restful是一种架构style,目前常说的有restful web service, resultful http.现在热搜榜的微服务,大多数会采用Restful方式. JAX-RS 作为一个Re ...
- Web Service学习之二:Web Service(for JAVA)的几种框架
在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析)
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
- Web Service学习文旦下载
Web Service的学习暂且告一段落,因为毕竟只是对它作简要了解,至于其原理什么并不打算涉及. 在这里我提供下我之前文档的整理版本: http://kuai.xunlei.com/d/YlzvAG ...
- Web Service学习笔记
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
随机推荐
- 成为一个PHP专家:缺失的环节
这一篇文章是“Becoming a PHP Professional”系列 4 篇博文中的第 1 篇. 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的 ...
- 学习webView控件使用
WebView 对象用于网页显示使用,简单的学习并使用了一下. 1.首先在 layout 中摆一个全屏的 webview 控件 (main.xml ) <?xml version="1 ...
- 有关于kali linux安装eclipse出现的一系列问题
第一步下载jdk,以及eclipse我就不再细说/官网都有的下载.(记得下载自己对应的版本就好了) 对于kali linux有这么一个问题,也是一直惹大家烦恼的问题--kali linux自带了jav ...
- android4.4.2内核移植3.4.1
01◑ 内核源码总目录下Makefile文件修改: 195行: ARCH ?= $(SUBARCH)替换成: ARCH ?= arm 02◑ arch/arm下makefile: ①差7行 # tes ...
- Android Studio上的几个插件
转载:http://blog.csdn.net/maosidiaoxian/article/details/44992655 以下所有插件都可以在Idea的插件库中找到,如果你与我一样在Android ...
- Codeforces Round #207 (Div. 1)B(数学)
数学so奇妙.. 这题肯定会有一个循环节 就是最小公倍数 对于公倍数内的相同的数的判断 就要借助最大公约数了 想想可以想明白 #include <iostream> #include< ...
- WEB前端开发成长指南
小 编注:相比起网页射击狮,操纵代码的前端攻城狮凭着双手在键盘巴拉巴拉敲出的字符,就能赋予二次元的静态页面生命,各种lovely 的~~fabulous的~~elegant的交互效果,那叫一个锦上添花 ...
- LeetCode Binary Tree Preorder Traversal 先根遍历
题意:给一棵树,求其先根遍历的结果. 思路: (1)深搜法: /** * Definition for a binary tree node. * struct TreeNode { * int va ...
- oracle中怎么查看存储过程的源码
今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...
- windows 下使用 MinGW + msys 编译 ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...