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解决无法处理的数据类型的更多相关文章

  1. Web Service学习-CXF开发Web Service实例demo(一)

    Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...

  2. Web Service学习笔记:动态调用WebService

    原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...

  3. Web Service学习-CXF开发Web Service的权限控制(二)

    Web Service怎样进行权限控制? 解决思路:server端要求input消息总是携带实username.password信息,假设没实username和password信息.直接拒绝调用 解决 ...

  4. Web Service学习之一:Web Service原理

    一.定义 Web Service 不是框架也不是技术 而是解决远程调用.跨平台调用.跨语言调用问题的一种规范. 二.应用1.同一个公司新.旧系统的整合:比如CRM系统与OA.客服系统相互调用2.不同公 ...

  5. Java Restful Web Service 学习指南

    Restful是一种架构style,目前常说的有restful web service, resultful http.现在热搜榜的微服务,大多数会采用Restful方式. JAX-RS 作为一个Re ...

  6. Web Service学习之二:Web Service(for JAVA)的几种框架

    在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...

  7. Web Service学习笔记(webservice、soap、wsdl、jws详细分析)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

  8. Web Service学习文旦下载

    Web Service的学习暂且告一段落,因为毕竟只是对它作简要了解,至于其原理什么并不打算涉及. 在这里我提供下我之前文档的整理版本: http://kuai.xunlei.com/d/YlzvAG ...

  9. Web Service学习笔记

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

随机推荐

  1. 成为一个PHP专家:缺失的环节

    这一篇文章是“Becoming a PHP Professional”系列 4 篇博文中的第 1 篇. 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的 ...

  2. 学习webView控件使用

    WebView 对象用于网页显示使用,简单的学习并使用了一下. 1.首先在 layout 中摆一个全屏的 webview 控件 (main.xml ) <?xml version="1 ...

  3. 有关于kali linux安装eclipse出现的一系列问题

    第一步下载jdk,以及eclipse我就不再细说/官网都有的下载.(记得下载自己对应的版本就好了) 对于kali linux有这么一个问题,也是一直惹大家烦恼的问题--kali linux自带了jav ...

  4. android4.4.2内核移植3.4.1

    01◑ 内核源码总目录下Makefile文件修改: 195行: ARCH ?= $(SUBARCH)替换成: ARCH ?= arm 02◑ arch/arm下makefile: ①差7行 # tes ...

  5. Android Studio上的几个插件

    转载:http://blog.csdn.net/maosidiaoxian/article/details/44992655 以下所有插件都可以在Idea的插件库中找到,如果你与我一样在Android ...

  6. Codeforces Round #207 (Div. 1)B(数学)

    数学so奇妙.. 这题肯定会有一个循环节 就是最小公倍数 对于公倍数内的相同的数的判断 就要借助最大公约数了 想想可以想明白 #include <iostream> #include< ...

  7. WEB前端开发成长指南

    小 编注:相比起网页射击狮,操纵代码的前端攻城狮凭着双手在键盘巴拉巴拉敲出的字符,就能赋予二次元的静态页面生命,各种lovely 的~~fabulous的~~elegant的交互效果,那叫一个锦上添花 ...

  8. LeetCode Binary Tree Preorder Traversal 先根遍历

    题意:给一棵树,求其先根遍历的结果. 思路: (1)深搜法: /** * Definition for a binary tree node. * struct TreeNode { * int va ...

  9. oracle中怎么查看存储过程的源码

    今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...

  10. windows 下使用 MinGW + msys 编译 ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...