四、CXF WebService中传递复杂类型对象

简介:

前面介绍的都是传递简单的字符串,现在开始介绍传递复杂类型的对象。如JavaBean、Array、List、Map等。

1、 首先看看服务器端的代码所需要的JavaBean对象

package com.hoo.entity;
 
import java.io.Serializable;
 
/**
 * <b>function:</b>User Entity
 * @author hoojo
 * @createDate Dec 16, 2010 10:20:02 PM
 * @file User.java
 * @package com.hoo.entity
 * @project AxisWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class User implements Serializable {
    private static final long serialVersionUID = 677484458789332877L;
    private int id;
    private String name;
    private String email;
    private String address;
    
    //getter、setter
    
    @Override
    public String toString() {
        return this.id + "#" + this.name + "#" + this.email + "#" + this.address;
    }
}

下面的是集合传递Users,CXF直接传递集合对象会出现异常,用一个对象包装下就Ok了,不知道是什么原因。异常信息如下:

DefaultValidationEventHandler: [ERROR]: unexpected element(uri:"", local:"item")
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"item")
package com.hoo.entity;
 
import java.util.HashMap;
import java.util.List;
 
/**
 * <b>function:</b> Users Entity
 * @author hoojo
 * @createDate 2011-3-18 上午09:27:31
 * @file Users.java
 * @package com.hoo.entity
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class Users {
    private List<User> users;
    private User[] userArr;
    private HashMap<String, User> maps;
        
    //getter、setter方法
}

2、 下面看看复杂对象传递的服务器端代码

package com.hoo.service;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import com.hoo.entity.User;
import com.hoo.entity.Users;
 
/**
 * <b>function:</b> WebService传递复杂对象,如JavaBean、Array、List、Map等
 * @author hoojo
 * @createDate 2011-3-18 上午08:22:55
 * @file ComplexUserService.java
 * @package com.hoo.service
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@WebService
@SOAPBinding(style = Style.RPC)
@SuppressWarnings("deprecation")
public class ComplexUserService {
    
    public User getUserByName(@WebParam(name = "name") String name) {
        User user = new User();
        user.setId(new Date().getSeconds());
        user.setName(name);
        user.setAddress("china");
        user.setEmail(name + "@hoo.com");
        return user;
    }
    
    public void setUser(User user) {
        System.out.println("############Server setUser###########");
        System.out.println("setUser:" + user);
    }
    
    public Users getUsers(int i) {
        List<User> users = new ArrayList<User>();
        for (int j = 0; j <= i; j++) {
            User user = new User();
            user.setId(new Date().getSeconds());
            user.setName("jack#" + j);
            user.setAddress("china");
            user.setEmail("jack" + j + "@hoo.com");
            users.add(user);
        }
        Users u = new Users();
        u.setUsers(users);
        return u;
    }
    
    public void setUsers(Users users) {
        System.out.println("############Server setUsers###########");
        for (User u : users.getUsers()) {
            System.out.println("setUsers:" + u);
        }
    }
    
    public Users getUserArray(int i) {
        User[] users = new User[i];
        for (int j = 0; j < i; j++) {
            User user = new User();
            user.setId(new Date().getSeconds());
            user.setName("jack#" + j);
            user.setAddress("china");
            user.setEmail("jack" + j + "@hoo.com");
            users[j] = user;
        }
        Users u = new Users();
        u.setUserArr(users);
        return u;
    }
    
    public void setUserArray(Users users) {
        System.out.println("############Server setUserArray###########");
        for (User u : users.getUserArr()) {
            System.out.println("setUserArray:" + u);
        }
    }
    
    public void setUserMap(Users maps) {
        System.out.println("############Server setUserMap###########");
        System.out.println("setUserMap:" + maps.getMaps());
    }
    
    public Users getUserMap() {
        HashMap<String, User> users = new HashMap<String, User>();
        User user = new User();
        user.setId(new Date().getSeconds());
        user.setName("jack#");
        user.setAddress("china#");
        user.setEmail("jack@hoo.com");
        users.put("A", user);
        
        user = new User();
        user.setId(new Date().getSeconds());
        user.setName("tom");
        user.setAddress("china$$");
        user.setEmail("tom@hoo.com");
        users.put("B", user);
        Users u = new Users();
        u.setMaps(users);
        
        return u;
    }
}

3、 发布WebService的代码

package com.hoo.service.deploy;
 
import com.hoo.service.ComplexUserService;
 
/**
 * <b>function:</b> 发布ComplexUserService服务
 * @author hoojo
 * @createDate 2011-3-18 上午08:28:57
 * @file DeployComplexUserService.java
 * @package com.hoo.service.deploy
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class DeployComplexUserService {
 
    public static void main(String[] args) throws InterruptedException {
        String address = "http://localhost:9000/complexUser";
        DeployUtils.deployService(address, new ComplexUserService());
        Thread.sleep(1000 * 60 * 20);
        System.exit(0);
        System.out.println("Server exit ");
    }
}

DeployUtils.java

package com.hoo.service.deploy;
 
import javax.xml.ws.Endpoint;
 
/**
 * <b>function:</b> 发布WebService工具类
 * @author hoojo
 * @createDate Mar 17, 2011 8:14:05 PM
 * @file DeployUtils.java
 * @package com.hoo.service.deploy
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public final class DeployUtils {
    /**
     * <b>function:</b>发布WebService
     * @author hoojo
     */
    public static void deployService(String address, Object service) {
        System.out.println("Server start ……");
        Endpoint.publish(address, service);
    }
}

 

4、 通过发布后的地址的http://localhost:9000/complexUser?wsdl; wsdl中的内容定制你的客户端调用WebService的接口,当然你也可以让服务器端实现一个接口。

package com.hoo.service;
 
import javax.jws.WebParam;
import javax.jws.WebService;
import com.hoo.entity.User;
import com.hoo.entity.Users;
 
/**
 * <b>function:</b>定制客户端请求WebService所需要的接口
 * @author hoojo
 * @createDate 2011-3-18 上午08:22:55
 * @file ComplexUserService.java
 * @package com.hoo.service
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@WebService
public interface IComplexUserService {
    
    public User getUserByName(@WebParam(name = "name") String name);
    
    public void setUser(User user);
    
    public Users getUsers(int i);
    
    public void setUsers(Users users);
    
    public Users getUserArray(int i);
    
    public void setUserArray(Users users);
    
    public void setUserMap(Users maps);
    
    public Users getUserMap();
}

5、 客户端调用代码

package com.hoo.client;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.hoo.entity.User;
import com.hoo.entity.Users;
import com.hoo.service.IComplexUserService;
 
/**
 * <b>function:</b>调用ComplexUserService客户端
 * @author hoojo
 * @createDate 2011-3-18 上午08:37:11
 * @file ComplexUserServiceClient.java
 * @package com.hoo.client
 * @project CXFWebService
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class ComplexUserServiceClient {
 
    public static void main(String[] args) {
        //调用WebService
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(IComplexUserService.class);
        factory.setAddress("http://localhost:9000/complexUser");
        
        IComplexUserService service = (IComplexUserService) factory.create();
        
        System.out.println("#############Client getUserByName##############");
        User user = service.getUserByName("hoojo");
        System.out.println(user);
        
        user.setAddress("China-Guangzhou");
        service.setUser(user);
        
        System.out.println("#############Client getUsers##############");
        Users users = service.getUsers(4);
        System.out.println(users);
        List<User> tempUsers = new ArrayList<User>();
        for (User u : users.getUsers()) {
            System.out.println(u);
            u.setName("hoojo" + new Random().nextInt(100));
            u.setAddress("Chian-GuangZhou#" + new Random().nextInt(100));
            tempUsers.add(u);
        }
        users.getUsers().clear();
        users.getUsers().addAll(tempUsers);
        service.setUsers(users);
        
        System.out.println("#############Client getUserArray##############");
        users = service.getUserArray(4);
        User[] userArr = new User[4];
        int i = 0;
        for (User u : users.getUserArr()) {
            System.out.println(u);
            u.setName("hoojo" + new Random().nextInt(100));
            u.setAddress("Chian-ShenZhen#" + new Random().nextInt(100));
            userArr[i] = u;
            i ++;
        }
        
        users.setUserArr(userArr);
        service.setUserArray(users);
        
        System.out.println("##################Client getUserMap###############");
        users = service.getUserMap();
        System.out.println(users.getMaps());
        users.getMaps().put("ABA", userArr[0]);
        service.setUserMap(users);
    }
}

6、 运行后结果如下

控制台客户端结果:

2011-3-18 10:31:11 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://service.hoo.com/}IComplexUserServiceService from class com.hoo.service.IComplexUserService
#############Client getUserByName##############
12#hoojo#hoojo@hoo.com#china
#############Client getUsers##############
com.hoo.entity.Users@1148603
12#jack#0#jack0@hoo.com#china
12#jack#1#jack1@hoo.com#china
12#jack#2#jack2@hoo.com#china
12#jack#3#jack3@hoo.com#china
12#jack#4#jack4@hoo.com#china
#############Client getUserArray##############
12#jack#0#jack0@hoo.com#china
12#jack#1#jack1@hoo.com#china
12#jack#2#jack2@hoo.com#china
12#jack#3#jack3@hoo.com#china
##################Client getUserMap###############
{A=12#jack##jack@hoo.com#china#, B=12#tom#tom@hoo.com#china$$}

服务器端结果:

Server start ……
2011-3-18 10:31:03 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://service.hoo.com/}ComplexUserServiceService from class com.hoo.service.ComplexUserService
2011-3-18 10:31:03 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be http://localhost:9000/complexUser
2011-03-18 10:31:03.906:INFO::jetty-7.2.2.v20101205
2011-03-18 10:31:04.046:INFO::Started SelectChannelConnector@localhost:9000
############Server setUser###########
setUser:12#hoojo#hoojo@hoo.com#China-Guangzhou
############Server setUsers###########
setUsers:12#hoojo67#jack0@hoo.com#Chian-GuangZhou#94
setUsers:12#hoojo95#jack1@hoo.com#Chian-GuangZhou#27
setUsers:12#hoojo29#jack2@hoo.com#Chian-GuangZhou#0
setUsers:12#hoojo94#jack3@hoo.com#Chian-GuangZhou#70
setUsers:12#hoojo49#jack4@hoo.com#Chian-GuangZhou#92
############Server setUserArray###########
setUserArray:12#hoojo24#jack0@hoo.com#Chian-ShenZhen#30
setUserArray:12#hoojo57#jack1@hoo.com#Chian-ShenZhen#81
setUserArray:12#hoojo84#jack2@hoo.com#Chian-ShenZhen#41
setUserArray:12#hoojo88#jack3@hoo.com#Chian-ShenZhen#79
############Server setUserMap###########
setUserMap:{ABA=12#hoojo24#jack0@hoo.com#Chian-ShenZhen#30, A=12#jack##jack@hoo.com#china#, B=12#tom#tom@hoo.com#china$$}






本文转自hoojo博客园博客,原文链接:http://www.cnblogs.com/hoojo/archive/2011/03/30/1999523.html,如需转载请自行联系原作者
目录
相关文章
|
4月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
1月前
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
|
4月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
4月前
|
Linux 应用服务中间件 网络安全
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
|
4月前
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
|
4月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
4月前
|
存储 安全 网络安全
【Azure 环境】使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢(Microsoft Antimalware)?
【Azure 环境】使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢(Microsoft Antimalware)?
|
4月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
4月前
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)