Web Service学习之六:CXF解决无法处理的数据类型

摘要:
CXF不能处理像Map这样的复杂数据类型,因此需要单独转换和处理。

  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文档  返回数据类型均为可解析的类型

Web Service学习之六:CXF解决无法处理的数据类型第1张

服务端实现类:

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解决无法处理的数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spring注解驱动第六讲--@Import注解C++静态库与动态库(比较透彻)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#:MapControl基本操作代码整理

整理了 MapConrol各基本功能的实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using ESRI.ArcGI...

在Java代码中使用iTextPDF生成PDF

1. 生成PDF 载入字体 static { FontFactory.register("/fonts/msyh.ttf"); FontFactory.register("/fonts/msyhbd.ttf"); FontFactory.register("/fonts/simsun.ttc")...

mysql-5.6.27源码安装及错误解决办法

环境:centos6.5.x86_64 wgethttp://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.27.tar.gz yum install -y cmake 当然也可以自己下载源码包安装,为方便就Yum安装了 useradd -s /sbin/nologin mysql tar zxvf mysql-...

金蝶云星空使用WebAPI来新增单据

有很多客户需求在后台自动生成某张单据,金蝶云星空提供了WebApi,包含了保存,提交,审核,删除单据的接口,下面以生产订单的保存,提交,审核为例,说明一下应用WebApi后台自动生成生产订单的功能,下面是代码示例,其他单据可以根据示例代码做相应的修改: using Kingdee.BOS.Core.Bill.PlugIn;using System;usin...

C#配置文件管理

  最近在做项目的过程中用到配置文件,本文简要说明本人在项目过程中是如何使用配置文件的,目的是加深自己对配置文件管理的理解,以便在下次使用时能做到轻松自如。   配置文件,顾名思义,是用户在使用系统或者软件时需要根据不同的状况手动配置的文件。在c#wpf项目中,配置文件一般有两种,一种是在系统中新建的配置文件即应用程序配置文件,命名一般习惯为App.con...

单点登陆 ---密钥

一、需求描述 现在有A系统和B系统,需要在A系统进行单点登陆到B系统。 二、B系统要做事 1、提供一个可以让A系统登陆的网址 http://localhost:8083/Account/SingleSignOn/?u=xxx&token=FB92B341DBDB59D7 其中,u为加密后的用户名,token为B系统与A系统单点登录握手密钥 2、控制...