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. 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序(老罗学习笔记2)

    在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文 ...

  2. Android安卓开发中图片缩放讲解

    安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法: 方法1:按固定比例进行缩放 在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们 ...

  3. 启动PL/SQL Developer 报字符编码不一致错误 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. Note: you can set the client

    今天写hibernate时候遇到一些异常 代码: 出现异常情况: 出现以上原因是Session关闭 如果不是使用的SessionFactory.getSession()来获得Session. 而是使用 ...

  4. HDU 4902

    数据太弱,直接让我小暴力一下就过了,一开始没注意到时间是15000MS,队友发现真是太给力了 #include <cstdio> #include <cstring> ],x[ ...

  5. fancybox 关闭弹出窗口 parent.$.fancybox.close(); 无反应 fancybox 关闭弹出窗口父页面自动刷新,弹出子窗口前后事件

    当我们在父页面使用 fancybox 弹出窗口后,如果想自己手动关闭,则可以 function Cancel() { parent.$.fancybox.close(); } 如果关闭没有反应,最好看 ...

  6. IOS cocos2d笔记1

    结点添加.删除.获取1.结点:CCNode * childNode = [CCNode node]; 2.加入结点[myNode addChild:childNode z:0 tag:123];//z ...

  7. LeetCode Triangle 三角形(最短路)

    题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...

  8. 【Java学习笔记】数组使用

    package aaa; public class aaa { public static void main(String args[]) { int a[]={1,2,3,4}; for(int ...

  9. 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)

    本文记录OpenGL播放视频的技术.上一篇文章中,介绍了一种简单的使用OpenGL显示视频的方式.但是那还不是OpenGL显示视频技术的精髓.和Direct3D一样,OpenGL更好的显示视频的方式也 ...

  10. oracle 回收站管理

    oracle10g,在pl/sql中选中删除后会出现类似:BIN$nJ5JuP9cQmqPaArFei384g==$0的表. 1.查看回收站 select * from user_recyclebin ...