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. NuGet学习笔记

    NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 NuGet学习笔记(3)——搭建属于自己的NuGet服务器

  2. IP地址分类及私网IP

    5类IP地址: IP地址共有32位字节,其中A~C类IP地址由类标识号.网络地址和主机地址组成,A类标识最高位为0,网络地址为1字节,主机地址为3字节, B类标识最高位为10,网络地址为2字节,主机地 ...

  3. 【Todo】抽象渗漏法则 & 找到理想员工 & 软件开发成功 12 法则 & Joel on Software

    Joel应该是个软件专家,这是他文章汇总的中文版本: http://local.joelonsoftware.com/wiki/Chinese_%28Simplified%29 其中有几篇值得好好看看 ...

  4. Codeforces Round #261 (Div. 2) D. Pashmak and Parmida's problem (树状数组求逆序数 变形)

    题目链接 题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求i和j的种类数. 我们可以用map预处理出  ...

  5. bzoj2875: [Noi2012]随机数生成器

    矩阵乘法. x[n] = {x[0],1} * ( {a,0} ^ n ) {b,1} 写成这样谁能看懂.... noi里的大水题.我居然 #include<cstdio> #includ ...

  6. eclipse启动出现“An Error has Occurred. See the log file”解决方法

    最近在启动eclipse时出现了“An Error has Occurred. See the log file”的错误,点击确定后也不能启动eclipse.查看log文件,出现类似: java.la ...

  7. 为apache单独编译mod_rewrite.so

    今天要把一个站点搬到一台Red Hat 4.1.2-42系统上,在配置rewrite的时候,发现apache没有mod_rewrite,可能是当初编译apache的时候没有带上 --enable-re ...

  8. AI 状态机

    by AKara 2010-11-11 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 一个简单横版游戏 ...

  9. Android Broadcast Receiver

    说明 有时候我们在做android系统软件的时候,经常会需要做的事就是开机重新设置上次关机前的状态,当然,我们就会用到这个开机广播: <uses-permission android:name= ...

  10. mysql 索引与优化like查询

    索引与优化like查询 1. like %keyword    索引失效,使用全表扫描.但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描. 2. like key ...