CXF WebService中传递复杂类型对象

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

[java]  view plain  copy
 print ?
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. import java.io.Serializable;  
  6.   
  7.    
  8.   
  9. /** 
  10.  
  11.  * <b>function:</b>User Entity 
  12.  
  13.  * @author hoojo 
  14.  
  15.  * @createDate Dec 16, 2010 10:20:02 PM 
  16.  
  17.  * @file User.java 
  18.  
  19.  * @package com.hoo.entity 
  20.  
  21.  * @project AxisWebService 
  22.  
  23.  * @blog http://blog.csdn.net/IBM_hoojo 
  24.  
  25.  * @email hoojo_@126.com 
  26.  
  27.  * @version 1.0 
  28.  
  29.  */  
  30.   
  31. public class User implements Serializable {  
  32.   
  33.     private static final long serialVersionUID = 677484458789332877L;  
  34.   
  35.     private int id;  
  36.   
  37.     private String name;  
  38.   
  39.     private String email;  
  40.   
  41.     private String address;  
  42.   
  43.       
  44.   
  45.     //getter、setter  
  46.   
  47.       
  48.   
  49.     @Override  
  50.   
  51.     public String toString() {  
  52.   
  53.         return this.id + "#" + this.name + "#" + this.email + "#" + this.address;  
  54.   
  55.     }  
  56.   
  57. }  



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

DefaultValidationEventHandler: [ERROR]: unexpected element(uri:"", local:"item")
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"item")

[java]  view plain  copy
 print ?
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. import java.util.HashMap;  
  6.   
  7. import java.util.List;  
  8.   
  9.    
  10.   
  11. /** 
  12.  
  13.  * <b>function:</b> Users Entity 
  14.  
  15.  * @author hoojo 
  16.  
  17.  * @createDate 2011-3-18 上午09:27:31 
  18.  
  19.  * @file Users.java 
  20.  
  21.  * @package com.hoo.entity 
  22.  
  23.  * @project CXFWebService 
  24.  
  25.  * @blog http://blog.csdn.net/IBM_hoojo 
  26.  
  27.  * @email hoojo_@126.com 
  28.  
  29.  * @version 1.0 
  30.  
  31.  */  
  32.   
  33. public class Users {  
  34.   
  35.     private List<User> users;  
  36.   
  37.     private User[] userArr;  
  38.   
  39.     private HashMap<String, User> maps;  
  40.   
  41.           
  42.   
  43.     //getter、setter方法  
  44.   
  45. }  



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

[java]  view plain  copy
 print ?
  1. package com.hoo.service;  
  2.   
  3.    
  4.   
  5. import java.util.ArrayList;  
  6.   
  7. import java.util.Date;  
  8.   
  9. import java.util.HashMap;  
  10.   
  11. import java.util.List;  
  12.   
  13. import javax.jws.WebParam;  
  14.   
  15. import javax.jws.WebService;  
  16.   
  17. import javax.jws.soap.SOAPBinding;  
  18.   
  19. import javax.jws.soap.SOAPBinding.Style;  
  20.   
  21. import com.hoo.entity.User;  
  22.   
  23. import com.hoo.entity.Users;  
  24.   
  25.    
  26.   
  27. /** 
  28.  
  29.  * <b>function:</b> WebService传递复杂对象,如JavaBean、Array、List、Map等 
  30.  
  31.  * @author hoojo 
  32.  
  33.  * @createDate 2011-3-18 上午08:22:55 
  34.  
  35.  * @file ComplexUserService.java 
  36.  
  37.  * @package com.hoo.service 
  38.  
  39.  * @project CXFWebService 
  40.  
  41.  * @blog http://blog.csdn.net/IBM_hoojo 
  42.  
  43.  * @email hoojo_@126.com 
  44.  
  45.  * @version 1.0 
  46.  
  47.  */  
  48.   
  49. @WebService  
  50.   
  51. @SOAPBinding(style = Style.RPC)  
  52.   
  53. @SuppressWarnings("deprecation")  
  54.   
  55. public class ComplexUserService {  
  56.   
  57.       
  58.   
  59.     public User getUserByName(@WebParam(name = "name") String name) {  
  60.   
  61.         User user = new User();  
  62.   
  63.         user.setId(new Date().getSeconds());  
  64.   
  65.         user.setName(name);  
  66.   
  67.         user.setAddress("china");  
  68.   
  69.         user.setEmail(name + "@hoo.com");  
  70.   
  71.         return user;  
  72.   
  73.     }  
  74.   
  75.       
  76.   
  77.     public void setUser(User user) {  
  78.   
  79.         System.out.println("############Server setUser###########");  
  80.   
  81.         System.out.println("setUser:" + user);  
  82.   
  83.     }  
  84.   
  85.       
  86.   
  87.     public Users getUsers(int i) {  
  88.   
  89.         List<User> users = new ArrayList<User>();  
  90.   
  91.         for (int j = 0; j <= i; j++) {  
  92.   
  93.             User user = new User();  
  94.   
  95.             user.setId(new Date().getSeconds());  
  96.   
  97.             user.setName("jack#" + j);  
  98.   
  99.             user.setAddress("china");  
  100.   
  101.             user.setEmail("jack" + j + "@hoo.com");  
  102.   
  103.             users.add(user);  
  104.   
  105.         }  
  106.   
  107.         Users u = new Users();  
  108.   
  109.         u.setUsers(users);  
  110.   
  111.         return u;  
  112.   
  113.     }  
  114.   
  115.       
  116.   
  117.     public void setUsers(Users users) {  
  118.   
  119.         System.out.println("############Server setUsers###########");  
  120.   
  121.         for (User u : users.getUsers()) {  
  122.   
  123.             System.out.println("setUsers:" + u);  
  124.   
  125.         }  
  126.   
  127.     }  
  128.   
  129.       
  130.   
  131.     public Users getUserArray(int i) {  
  132.   
  133.         User[] users = new User[i];  
  134.   
  135.         for (int j = 0; j < i; j++) {  
  136.   
  137.             User user = new User();  
  138.   
  139.             user.setId(new Date().getSeconds());  
  140.   
  141.             user.setName("jack#" + j);  
  142.   
  143.             user.setAddress("china");  
  144.   
  145.             user.setEmail("jack" + j + "@hoo.com");  
  146.   
  147.             users[j] = user;  
  148.   
  149.         }  
  150.   
  151.         Users u = new Users();  
  152.   
  153.         u.setUserArr(users);  
  154.   
  155.         return u;  
  156.   
  157.     }  
  158.   
  159.       
  160.   
  161.     public void setUserArray(Users users) {  
  162.   
  163.         System.out.println("############Server setUserArray###########");  
  164.   
  165.         for (User u : users.getUserArr()) {  
  166.   
  167.             System.out.println("setUserArray:" + u);  
  168.   
  169.         }  
  170.   
  171.     }  
  172.   
  173.       
  174.   
  175.     public void setUserMap(Users maps) {  
  176.   
  177.         System.out.println("############Server setUserMap###########");  
  178.   
  179.         System.out.println("setUserMap:" + maps.getMaps());  
  180.   
  181.     }  
  182.   
  183.       
  184.   
  185.     public Users getUserMap() {  
  186.   
  187.         HashMap<String, User> users = new HashMap<String, User>();  
  188.   
  189.         User user = new User();  
  190.   
  191.         user.setId(new Date().getSeconds());  
  192.   
  193.         user.setName("jack#");  
  194.   
  195.         user.setAddress("china#");  
  196.   
  197.         user.setEmail("jack@hoo.com");  
  198.   
  199.         users.put("A", user);  
  200.   
  201.           
  202.   
  203.         user = new User();  
  204.   
  205.         user.setId(new Date().getSeconds());  
  206.   
  207.         user.setName("tom");  
  208.   
  209.         user.setAddress("china$$");  
  210.   
  211.         user.setEmail("tom@hoo.com");  
  212.   
  213.         users.put("B", user);  
  214.   
  215.         Users u = new Users();  
  216.   
  217.         u.setMaps(users);  
  218.   
  219.           
  220.   
  221.         return u;  
  222.   
  223.     }  
  224.   
  225. }  



3、 发布WebService的代码

[java]  view plain  copy
 print ?
  1. package com.hoo.service.deploy;  
  2.   
  3.    
  4.   
  5. import com.hoo.service.ComplexUserService;  
  6.   
  7.    
  8.   
  9. /** 
  10.  
  11.  * <b>function:</b> 发布ComplexUserService服务 
  12.  
  13.  * @author hoojo 
  14.  
  15.  * @createDate 2011-3-18 上午08:28:57 
  16.  
  17.  * @file DeployComplexUserService.java 
  18.  
  19.  * @package com.hoo.service.deploy 
  20.  
  21.  * @project CXFWebService 
  22.  
  23.  * @blog http://blog.csdn.net/IBM_hoojo 
  24.  
  25.  * @email hoojo_@126.com 
  26.  
  27.  * @version 1.0 
  28.  
  29.  */  
  30.   
  31. public class DeployComplexUserService {  
  32.   
  33.    
  34.   
  35.     public static void main(String[] args) throws InterruptedException {  
  36.   
  37.         String address = "http://localhost:9000/complexUser";  
  38.   
  39.         DeployUtils.deployService(address, new ComplexUserService());  
  40.   
  41.         Thread.sleep(1000 * 60 * 20);  
  42.   
  43.         System.exit(0);  
  44.   
  45.         System.out.println("Server exit ");  
  46.   
  47.     }  
  48.   
  49. }  
  50.   
  51. DeployUtils.java  
  52.   
  53. package com.hoo.service.deploy;  
  54.   
  55.    
  56.   
  57. import javax.xml.ws.Endpoint;  
  58.   
  59.    
  60.   
  61. /** 
  62.  
  63.  * <b>function:</b> 发布WebService工具类 
  64.  
  65.  * @author hoojo 
  66.  
  67.  * @createDate Mar 17, 2011 8:14:05 PM 
  68.  
  69.  * @file DeployUtils.java 
  70.  
  71.  * @package com.hoo.service.deploy 
  72.  
  73.  * @project CXFWebService 
  74.  
  75.  * @blog http://blog.csdn.net/IBM_hoojo 
  76.  
  77.  * @email hoojo_@126.com 
  78.  
  79.  * @version 1.0 
  80.  
  81.  */  
  82.   
  83. public final class DeployUtils {  
  84.   
  85.     /** 
  86.  
  87.      * <b>function:</b>发布WebService 
  88.  
  89.      * @author hoojo 
  90.  
  91.      */  
  92.   
  93.     public static void deployService(String address, Object service) {  
  94.   
  95.         System.out.println("Server start ……");  
  96.   
  97.         Endpoint.publish(address, service);  
  98.   
  99.     }  
  100.   
  101. }  



 

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

[java]  view plain  copy
 print ?
  1. package com.hoo.service;  
  2.   
  3.    
  4.   
  5. import javax.jws.WebParam;  
  6.   
  7. import javax.jws.WebService;  
  8.   
  9. import com.hoo.entity.User;  
  10.   
  11. import com.hoo.entity.Users;  
  12.   
  13.    
  14.   
  15. /** 
  16.  
  17.  * <b>function:</b>定制客户端请求WebService所需要的接口 
  18.  
  19.  * @author hoojo 
  20.  
  21.  * @createDate 2011-3-18 上午08:22:55 
  22.  
  23.  * @file ComplexUserService.java 
  24.  
  25.  * @package com.hoo.service 
  26.  
  27.  * @project CXFWebService 
  28.  
  29.  * @blog http://blog.csdn.net/IBM_hoojo 
  30.  
  31.  * @email hoojo_@126.com 
  32.  
  33.  * @version 1.0 
  34.  
  35.  */  
  36.   
  37. @WebService  
  38.   
  39. public interface IComplexUserService {  
  40.   
  41.       
  42.   
  43.     public User getUserByName(@WebParam(name = "name") String name);  
  44.   
  45.       
  46.   
  47.     public void setUser(User user);  
  48.   
  49.       
  50.   
  51.     public Users getUsers(int i);  
  52.   
  53.       
  54.   
  55.     public void setUsers(Users users);  
  56.   
  57.       
  58.   
  59.     public Users getUserArray(int i);  
  60.   
  61.       
  62.   
  63.     public void setUserArray(Users users);  
  64.   
  65.       
  66.   
  67.     public void setUserMap(Users maps);  
  68.   
  69.       
  70.   
  71.     public Users getUserMap();  
  72.   
  73. }  



5、 客户端调用代码

[java]  view plain  copy
 print ?
  1. package com.hoo.client;  
  2.   
  3.    
  4.   
  5. import java.util.ArrayList;  
  6.   
  7. import java.util.List;  
  8.   
  9. import java.util.Random;  
  10.   
  11. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  12.   
  13. import com.hoo.entity.User;  
  14.   
  15. import com.hoo.entity.Users;  
  16.   
  17. import com.hoo.service.IComplexUserService;  
  18.   
  19.    
  20.   
  21. /** 
  22.  
  23.  * <b>function:</b>调用ComplexUserService客户端 
  24.  
  25.  * @author hoojo 
  26.  
  27.  * @createDate 2011-3-18 上午08:37:11 
  28.  
  29.  * @file ComplexUserServiceClient.java 
  30.  
  31.  * @package com.hoo.client 
  32.  
  33.  * @project CXFWebService 
  34.  
  35.  * @blog http://blog.csdn.net/IBM_hoojo 
  36.  
  37.  * @email hoojo_@126.com 
  38.  
  39.  * @version 1.0 
  40.  
  41.  */  
  42.   
  43. public class ComplexUserServiceClient {  
  44.   
  45.    
  46.   
  47.     public static void main(String[] args) {  
  48.   
  49.         //调用WebService  
  50.   
  51.         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  52.   
  53.         factory.setServiceClass(IComplexUserService.class);  
  54.   
  55.         factory.setAddress("http://localhost:9000/complexUser");  
  56.   
  57.           
  58.   
  59.         IComplexUserService service = (IComplexUserService) factory.create();  
  60.   
  61.           
  62.   
  63.         System.out.println("#############Client getUserByName##############");  
  64.   
  65.         User user = service.getUserByName("hoojo");  
  66.   
  67.         System.out.println(user);  
  68.   
  69.           
  70.   
  71.         user.setAddress("China-Guangzhou");  
  72.   
  73.         service.setUser(user);  
  74.   
  75.           
  76.   
  77.         System.out.println("#############Client getUsers##############");  
  78.   
  79.         Users users = service.getUsers(4);  
  80.   
  81.         System.out.println(users);  
  82.   
  83.         List<User> tempUsers = new ArrayList<User>();  
  84.   
  85.         for (User u : users.getUsers()) {  
  86.   
  87.             System.out.println(u);  
  88.   
  89.             u.setName("hoojo" + new Random().nextInt(100));  
  90.   
  91.             u.setAddress("Chian-GuangZhou#" + new Random().nextInt(100));  
  92.   
  93.             tempUsers.add(u);  
  94.   
  95.         }  
  96.   
  97.         users.getUsers().clear();  
  98.   
  99.         users.getUsers().addAll(tempUsers);  
  100.   
  101.         service.setUsers(users);  
  102.   
  103.           
  104.   
  105.         System.out.println("#############Client getUserArray##############");  
  106.   
  107.         users = service.getUserArray(4);  
  108.   
  109.         User[] userArr = new User[4];  
  110.   
  111.         int i = 0;  
  112.   
  113.         for (User u : users.getUserArr()) {  
  114.   
  115.             System.out.println(u);  
  116.   
  117.             u.setName("hoojo" + new Random().nextInt(100));  
  118.   
  119.             u.setAddress("Chian-ShenZhen#" + new Random().nextInt(100));  
  120.   
  121.             userArr[i] = u;  
  122.   
  123.             i ++;  
  124.   
  125.         }  
  126.   
  127.           
  128.   
  129.         users.setUserArr(userArr);  
  130.   
  131.         service.setUserArray(users);  
  132.   
  133.           
  134.   
  135.         System.out.println("##################Client getUserMap###############");  
  136.   
  137.         users = service.getUserMap();  
  138.   
  139.         System.out.println(users.getMaps());  
  140.   
  141.         users.getMaps().put("ABA", userArr[0]);  
  142.   
  143.         service.setUserMap(users);  
  144.   
  145.     }  
  146.   
  147. }  



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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用CXF调用WebService时,可以通过Java对象传递参数。具体步骤如下: 1. 创建Java对象,包含需要传递的参数。 2. 使用JAXB将Java对象转换为XML格式。 3. 将XML格式的参数传递WebService。 4. 在WebService端,将XML格式的参数再次转换为Java对象。 以下是一个简单的示例代码: ```java // 创建Java对象 Person person = new Person(); person.setName("张三"); person.setAge(20); // 将Java对象转换为XML格式 JAXBContext context = JAXBContext.newInstance(Person.class); Marshaller marshaller = context.createMarshaller(); StringWriter writer = new StringWriter(); marshaller.marshal(person, writer); String xml = writer.toString(); // 调用WebService HelloService service = new HelloService(); HelloPort port = service.getHelloPort(); String result = port.sayHello(xml); // 将XML格式的返回值转换为Java对象 Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader reader = new StringReader(result); Person response = (Person) unmarshaller.unmarshal(reader); // 输出结果 System.out.println(response.getName() + "," + response.getAge()); ``` 在上述示例,Person类是一个简单的Java对象,包含name和age两个属性。JAXBContext用于将Java对象转换为XML格式,Marshaller将Java对象编组为XML格式,而Unmarshaller则将XML格式解组为Java对象。最后,通过HelloPort的sayHello方法调用WebService,并将XML格式的参数传递给它。在WebService端,将XML格式的参数再次转换为Java对象,并返回XML格式的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值