axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问

本文转载自:http://blog.csdn.net/bestcxx/article/details/52434817

如果还没有接触过axis,可以先看入门文章

axis1-myeclipse/eclipse-入门级别-资源、流程、常见问题


0、首先在myeclipse中新建一个web项目 webserviceAxis1

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第1张图片


1、为项目 webserviceAxis1 引入 axis1 必须的几个jar包

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第2张图片


2、创建实体类 TheUser.java  注意需要序列化即实现接口Serializable,这对于在webservice 中传递实体类型是必须的

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第3张图片

TheUser.java 的内容如下

[java]  view plain  copy
  1. package com.demo.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class TheUser implements Serializable {  
  6.   
  7.     /** 
  8.      * 提供序列化编号,远程调用时要用到 
  9.      */  
  10.     private static final long serialVersionUID = -971720598087640397L;  
  11.   
  12.     private String username;  
  13.     private int age;  
  14.     public String getUsername() {  
  15.         return username;  
  16.     }  
  17.     public void setUsername(String username) {  
  18.         this.username = username;  
  19.     }  
  20.     public int getAge() {  
  21.         return age;  
  22.     }  
  23.     public void setAge(int age) {  
  24.         this.age = age;  
  25.     }  
  26.     @Override  
  27.     public String toString() {  
  28.         // TODO Auto-generated method stub  
  29.         return "username="+username+" ;age="+age;  
  30.     }  
  31.   
  32. }  

3、然后是编写webservice要发布的方法所在的类 TheUserWsddAction.java

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第4张图片


TheUserWsddAction.java 的代码如下:

[java]  view plain  copy
  1. package com.demo.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.LinkedHashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.xml.registry.infomodel.User;  
  9.   
  10. import com.demo.model.TheUser;  
  11.   
  12.   
  13. /** 
  14.  * 提供webservice方法 
  15.  * 将操作各种复杂的数据类型 
  16.  * @author WuJieJecket 
  17.  * 
  18.  */  
  19. public class TheUserWsddAction {  
  20.     /** 
  21.      * 提供一个简单类型的方法,便于比对 
  22.      * @param username 
  23.      * @return 
  24.      */  
  25.     public String getEasyEg(String username){  
  26.         return "You write "+username;  
  27.     }  
  28.   
  29.       
  30.     /** 
  31.      * webservice中仅返回一个实体类型 
  32.      * @param username 
  33.      * @param age 
  34.      * @return TheUser 
  35.      */  
  36.     public TheUser getTheUser(String username,int age){  
  37.         TheUser theu=new TheUser();  
  38.         theu.setUsername(username);  
  39.         theu.setAge(age);  
  40.         return theu;  
  41.           
  42.     }  
  43.       
  44.     /** 
  45.      * webservice中返回 List 类型 
  46.      * @param username 
  47.      * @param length 
  48.      * @return List TheUser 
  49.      */  
  50.     public List getTheUserList(String username,int size){  
  51.         List theuserlist=new ArrayList();  
  52.           
  53.         for(int i=0;i
  54.             TheUser tuser=new TheUser();  
  55.             tuser.setUsername(username+size);  
  56.             tuser.setAge(i);  
  57.               
  58.             theuserlist.add(tuser);  
  59.         }  
  60.           
  61.         return theuserlist;  
  62.           
  63.     }  
  64.   
  65.     /** 
  66.      * webservice中返回 User[]数据 类型 
  67.      * @param username 
  68.      * @param length 
  69.      * @return User[] 
  70.      */  
  71.     public TheUser[] getTheUserGroup(String username,int length){  
  72.         TheUser[] usergroups =new TheUser[length];  
  73.         for(int i=0;i
  74.             TheUser tuser=new TheUser();  
  75.             tuser.setUsername(username+length);  
  76.             tuser.setAge(i);  
  77.             usergroups[i]=(TheUser) tuser;  
  78.         }  
  79.         return usergroups;  
  80.           
  81.     }  
  82.       
  83.     /** 
  84.      * webservice中返回 Map数据 类型 
  85.      * @return 
  86.      */  
  87.     public Map getTheUserMap(){  
  88.         Map theusermap=new LinkedHashMap();  
  89.         TheUser tusera=new TheUser();  
  90.         TheUser tuserb=new TheUser();  
  91.           
  92.         tusera.setAge(20);  
  93.         tuserb.setAge(20);  
  94.           
  95.         tusera.setUsername("namea");  
  96.         tuserb.setUsername("nameb");  
  97.           
  98.         theusermap.put("tusera", tusera);  
  99.         theusermap.put("tuserb", tuserb);  
  100.         return theusermap;  
  101.           
  102.     }  
  103. }  

4、为了把webservice服务发布出去,我们需要修改项目的web.xml 的内容,具体参考

http://blog.csdn.net/bestcxx/article/details/52300248 中的

    8、在自己的项目中使用WSDD方式发布webservice服务,如其所言


如果你还记得axis 这个项目,把他的web.xml文件找出来,复制里面的内容,替换掉helloworldweb.xml (头部可以保留编码格式,内部的AdminServlet可以注释掉,尽管没有啥影响)

这里我把我的项目的文件贴出来,如果你看的看上面的文章,可以直接复制粘贴到你的web.xml文件中

[html]  view plain  copy
  1. xml version="1.0" encoding="ISO-8859-1"?>  
  2.   
  3. Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">  
  4.   
  5. <web-app>  
  6.   <display-name>Apache-Axisdisplay-name>  
  7.       
  8.     <listener>  
  9.         <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListenerlistener-class>  
  10.     listener>  
  11.       
  12.   <servlet>  
  13.     <servlet-name>AxisServletservlet-name>  
  14.     <display-name>Apache-Axis Servletdisplay-name>  
  15.     <servlet-class>  
  16.         org.apache.axis.transport.http.AxisServlet  
  17.     servlet-class>  
  18.   servlet>  
  19.   
  20.    
  21.   
  22.   <servlet>  
  23.     <servlet-name>SOAPMonitorServiceservlet-name>  
  24.     <display-name>SOAPMonitorServicedisplay-name>  
  25.     <servlet-class>  
  26.         org.apache.axis.monitor.SOAPMonitorService  
  27.     servlet-class>  
  28.     <init-param>  
  29.       <param-name>SOAPMonitorPortparam-name>  
  30.       <param-value>5001param-value>  
  31.     init-param>  
  32.     <load-on-startup>100load-on-startup>  
  33.   servlet>  
  34.   
  35.   <servlet-mapping>  
  36.     <servlet-name>AxisServletservlet-name>  
  37.     <url-pattern>/servlet/AxisServleturl-pattern>  
  38.   servlet-mapping>  
  39.   
  40.   <servlet-mapping>  
  41.     <servlet-name>AxisServletservlet-name>  
  42.     <url-pattern>*.jwsurl-pattern>  
  43.   servlet-mapping>  
  44.   
  45.   <servlet-mapping>  
  46.     <servlet-name>AxisServletservlet-name>  
  47.     <url-pattern>/services/*url-pattern>  
  48.   servlet-mapping>  
  49.   
  50.   <servlet-mapping>  
  51.     <servlet-name>SOAPMonitorServiceservlet-name>  
  52.     <url-pattern>/SOAPMonitorurl-pattern>  
  53.   servlet-mapping>  
  54.   
  55.    
  56.    
  57.    
  58.    
  59.   
  60.     <session-config>  
  61.           
  62.         <session-timeout>5session-timeout>  
  63.     session-config>  
  64.   
  65.       
  66.         <parameter name="allowedMethods" value="getName" />  
  67.         <parameter name="scope" value="request" />  
  68.     service>  
  69.     <service name="TheUserWsddAction" provider="java:RPC">  
  70.         <parameter name="className" value="com.demo.action.TheUserWsddAction" />  
  71.           
  72.         <parameter name="allowedMethods" value="*" />  
  73.         <parameter name="scope" value="request" />  
  74.            
  75.         <beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>  
  76.     service>  
  77. deployment>  

undeploy.wsdd

[html]  view plain  copy
  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">  
  2.     <service name="HelloWorldWSDD"/>  
  3.     <service name="TheUserWsddAction"/>  
  4. undeployment>  

6、启动服务,为了更为真实的实现那种效果,我把目前的项目打了war包,丢到了本地的tomcat服务器

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第7张图片


然后在DOS环境中执行wsdd服务加载的命令-注意项目名和端口号

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/webserviceAxis1/servlet/AxisServlet deployall.wsdd



然后访问一下,看发布是否成功

http://localhost:8080/webserviceAxis1/services

如下就成功了

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第8张图片

7.生成客户端代码,还是再DOS环境下运行

D:\tomcat7\webapps\webserviceAxis1\WEB-INF>Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/webserviceAxis1/services/TheUserWsddAction?wsdl


axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第9张图片


8、将客户端代码复制到另外的一个项目中,同时需要引入那8个jar包

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第10张图片

你会发现,相较而言,多了一个TheUser.java 当然这个类的位置你是可以自己决定的

因为本次发布的webservice方法含有复杂的返回类型

axis1.4发布返回复杂类型的webservice服务+代码访问+客户端访问_第11张图片

然后对代码做一点更改,即报错的地方有两种

一个是 TheUser_pkg.TheUser 改为TheUser

另一个是org.apache.xml.xml_soap.MapItem.class;改为  Map.class


9.最后是测试类

TheAxis1Test.java

[java]  view plain  copy
  1. import java.rmi.RemoteException;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import javax.xml.namespace.QName;  
  7. import javax.xml.rpc.ParameterMode;  
  8. import javax.xml.rpc.ServiceException;  
  9.   
  10. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUser;  
  11. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionService;  
  12. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionServiceLocator;  
  13.   
  14. import org.apache.axis.client.Call;  
  15. import org.apache.axis.client.Service;  
  16. import org.apache.axis.encoding.XMLType;  
  17. import org.apache.axis.encoding.ser.BeanDeserializerFactory;  
  18. import org.apache.axis.encoding.ser.BeanSerializerFactory;  
  19. import org.junit.Ignore;  
  20. import org.junit.Test;  
  21.   
  22. public class TheAxis1Test {  
  23.       
  24.         private static final String url="http://localhost:8080/webserviceAxis1/services/TheUserWsddAction";  
  25.           
  26.         /** 
  27.          * 最简单的,入参为一个 string , 反参为一个 string 
  28.          * @throws ServiceException 
  29.          * @throws RemoteException 
  30.          */  
  31.         @Test  
  32.         //@Ignore  
  33.         public void testgetEasyEg() throws ServiceException, RemoteException{  
  34.             //获取Service 对象-创建服务    
  35.             Service service=new Service();  
  36.               
  37.             //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  38.             Call call=(Call) service.createCall();    
  39.               
  40.             //设置远程调用桩-设置请求地址    
  41.             call.setTargetEndpointAddress(url);    
  42.               
  43.           //设置远程操作方法名    
  44.             /**  
  45.             * 设置调用的方法和方法的命名空间;  
  46.             * 因为这里是手动发布到webroot目录下的,所以命名空间和请求地址一致  
  47.             * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是  
  48.             * 包名倒写组成,如com.hoo.service,ns=http://service.hoo.com  
  49.             *  getSayHello 是要调用的方法名      
  50.             */    
  51.            call.setOperationName(new QName(null,"getEasyEg"));    
  52.              
  53.          //设置参数,执行远程方法    
  54.           String result=(String)call.invoke(new Object[]{"Jecket"});  
  55.           System.out.println(result);  
  56.         }  
  57.           
  58.         /** 
  59.          * 入参为 String,int 
  60.          * 反参为 TheUser 
  61.          * @throws ServiceException  
  62.          * @throws RemoteException  
  63.          */  
  64.         /** 
  65.          * @throws ServiceException 
  66.          * @throws RemoteException 
  67.          */  
  68.         /** 
  69.          * @throws ServiceException 
  70.          * @throws RemoteException 
  71.          */  
  72.         @Test  
  73.         //@Ignore  
  74.         public void testgetTheUser() throws ServiceException, RemoteException{  
  75.             //获取Service 对象-创建服务    
  76.             Service service=new Service();  
  77.               
  78.             //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  79.             Call call=(Call) service.createCall();    
  80.               
  81.             //设置远程调用桩-设置请求地址    
  82.             call.setTargetEndpointAddress(url);    
  83.               
  84.             //这里的QName的ns和wsdd文件中的对应  
  85.             QName qn = new QName("urn:TheUser""TheUser");  
  86.               
  87.             //这里是将对象序列化和反序列化的配置  
  88.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  89.   
  90.             //设置要调用的方法的名字  
  91.             call.setOperationName("getTheUser");  
  92.               
  93.             /* 
  94.              * 这里客户端和服务器端共用一个User,在实际开发中 
  95.              * 客户端和服务器端在不同的机器上,所以User对象可能不一样 
  96.              * 需要我们根据WebService的wsdl分析对象的属性 
  97.              */  
  98.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  99.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  100.             call.setReturnClass(TheUser.class);  
  101.             TheUser tuser = (TheUser) call.invoke(new Object[] {"Jecket",20});  
  102.             System.out.println("你获取了tuser ,名字是:"+tuser.getUsername()+" 年龄是 "+ tuser.getAge()+" 其他信息 "+tuser.getClass());  
  103.              
  104.               
  105.         }  
  106.           
  107.         /** 
  108.          * 入参为  String , int 
  109.          * 反参为 List 
  110.          * @throws ServiceException 
  111.          * @throws RemoteException 
  112.          *  
  113.          */  
  114.         @Test  
  115.         //@Ignore  
  116.         public void testgetTheUserList() throws ServiceException, RemoteException{  
  117.             //获取Service 对象-创建服务    
  118.             Service service=new Service();  
  119.               
  120.             //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  121.             Call call=(Call) service.createCall();    
  122.               
  123.             //设置远程调用桩-设置请求地址    
  124.             call.setTargetEndpointAddress(url);    
  125.               
  126.             //这里的QName的ns和wsdd文件中的对应  
  127.             QName qn = new QName("urn:TheUser""TheUser");  
  128.               
  129.             //这里是将对象序列化和反序列化的配置  
  130.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  131.   
  132.             //设置要调用的方法的名字  
  133.             call.setOperationName("getTheUserList");  
  134.               
  135.               
  136.             /* 
  137.              * 这里客户端和服务器端共用一个User,在实际开发中 
  138.              * 客户端和服务器端在不同的机器上,所以User对象可能不一样 
  139.              * 需要我们根据WebService的wsdl分析对象的属性 
  140.              */  
  141.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  142.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  143.               
  144.             //设置返回值属性  
  145.             call.setReturnClass(List.class);  
  146.             List tus = (List) call.invoke(new Object[] {"Jecket",20});  
  147.               
  148.             for(TheUser tu: tus){  
  149.                 System.out.println("调用 getTheUserList() 你获取了tu ,名字是:"+tu.getUsername()+" 年龄是 "+ tu.getAge()+" 其他信息 "+tu.getClass());  
  150.             }  
  151.               
  152.         }  
  153.         /** 
  154.          * 入参为:String , int 
  155.          * 反参为:数组  
  156.          * @throws ServiceException  
  157.          * @throws RemoteException  
  158.          */  
  159.         /** 
  160.          * @throws ServiceException 
  161.          * @throws RemoteException 
  162.          */  
  163.         @Test  
  164.         //@Ignore  
  165.         public void testgetTheUserGroup() throws ServiceException, RemoteException{  
  166.             //获取Service 对象-创建服务    
  167.             Service service=new Service();  
  168.               
  169.             //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  170.             Call call=(Call) service.createCall();    
  171.               
  172.             //设置远程调用桩-设置请求地址    
  173.             call.setTargetEndpointAddress(url);    
  174.               
  175.             //这里的QName的ns和wsdd文件中的对应  
  176.             QName qn = new QName("urn:TheUser""TheUser");  
  177.               
  178.             //这里是将对象序列化和反序列化的配置  
  179.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  180.              
  181.             //设置要调用的方法的名字  
  182.             call.setOperationName("getTheUserGroup");  
  183.               
  184.             /* 
  185.              * 这里客户端和服务器端共用一个User,在实际开发中 
  186.              * 客户端和服务器端在不同的机器上,所以User对象可能不一样 
  187.              * 需要我们根据WebService的wsdl分析对象的属性 
  188.              */  
  189.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  190.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  191.               
  192.             //设置返回值属性  
  193.             call.setReturnClass(TheUser[].class);  
  194.               
  195.             TheUser[] tu=(TheUser[]) call.invoke(new Object[] {"Jecket",20});  
  196.               
  197.             for(TheUser tus:tu){  
  198.                 System.out.println("调用了getTheUserGroup() 方法 ,年龄:"+tus.getAge()+"  姓名:"+tus.getUsername()+" 所属的类:"+tus.getClass());  
  199.             }  
  200.               
  201.             //理解数据的类型  
  202.             /*String[] a={"1","2"}; 
  203.             for(String b:a){ 
  204.                 System.out.println(b); 
  205.             }*/  
  206.         }  
  207.           
  208.         @Test  
  209.         //@Ignore  
  210.         public void testgetTheUserMap() throws ServiceException, RemoteException{  
  211.             //获取Service 对象-创建服务    
  212.             Service service=new Service();  
  213.               
  214.             //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  215.             Call call=(Call) service.createCall();    
  216.               
  217.             //设置远程调用桩-设置请求地址    
  218.             call.setTargetEndpointAddress(url);    
  219.               
  220.             //这里的QName的ns和wsdd文件中的对应  
  221.             QName qn = new QName("urn:TheUser""TheUser");  
  222.               
  223.             //这里是将对象序列化和反序列化的配置  
  224.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  225.              
  226.             //设置要调用的方法的名字  
  227.             call.setOperationName("getTheUserMap");  
  228.               
  229.             //设置返回值属性  
  230.             call.setReturnClass(Map.class);  
  231.               
  232.             Map maps = (Map) call.invoke(new Object[]{});  
  233.            /*  
  234.             TheUser ta=(TheUser)maps.get("tusera"); 
  235.             TheUser tb=(TheUser)maps.get("tuserb"); 
  236.             System.out.println("调用了getTheUserMap() 方法 ,年龄:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所属的类:"+ta.getClass()); 
  237.             System.out.println("调用了getTheUserMap() 方法 ,年龄:"+tb.getAge()+"  姓名:"+tb.getUsername()+" 所属的类:"+tb.getClass()); 
  238.            */   
  239.              
  240.             //遍历  Map 的方法  
  241.             Iterator it=maps.keySet().iterator();  
  242.             while(it.hasNext()){  
  243.                 TheUser ta=maps.get(it.next());  
  244.                 System.out.println("调用了getTheUserMap() 方法 ,年龄:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所属的类:"+ta.getClass());  
  245.             }  
  246.               
  247.         }  
  248.           
  249.         /** 
  250.          * 使用webservice客户端进行调用 
  251.          * 返回的对象都是 object 
  252.          * @throws ServiceException  
  253.          * @throws RemoteException  
  254.          */  
  255.         @Test  
  256.         //@Ignore  
  257.         public void testhere() throws ServiceException, RemoteException{  
  258.             TheUserWsddActionService tuwas=new TheUserWsddActionServiceLocator();  
  259.             localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddAction tuwa=tuwas.getTheUserWsddAction();  
  260.             String r=tuwa.getEasyEg("nihao");  
  261.             System.out.println(r);  
  262.             Object[] a=tuwa.getTheUserList("Jecket"10);  
  263.             for(Object ob:a){  
  264.                 TheUser ta=(TheUser)ob;  
  265.                 System.out.println("年龄:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所属的类:"+ta.getClass());  
  266.             }  
  267.         }  
  268.       
  269.   
  270. }  


10、以上的例子入参都是简单的参数,比如String、int,如果是实体类、list等呢?

本例子为后续补充,不再赘述发布过程,只写出方法和调用方法

被调用的方法代码:

[java]  view plain  copy
  1. /** 
  2.      * 入参为 实体类 
  3.      * @param theUser 
  4.      * @return 
  5.      */  
  6.     public TheUser getByTheUser(TheUser theUser){  
  7.         return theUser;  
  8.     }  
  9.     /** 
  10.      * 入参为list类型 
  11.      * @param list 
  12.      * @return 
  13.      */  
  14.     public TheUser getByListTheUser(List list){  
  15.         return list.get(0);  
  16.     }  
  17.     /** 
  18.      * 入参为map类型 
  19.      * @param map 
  20.      * @return 
  21.      */  
  22.     public TheUser getByMapTheUser(Map map){  
  23.         return map.get("theUser0");  
  24.     }  

调用webservice方法的代码

[java]  view plain  copy
  1. /** 
  2.      * 入参为实体类 
  3.      * @throws ServiceException 
  4.      * @throws RemoteException 
  5.      */  
  6.     @Test  
  7.     //@Ignore  
  8.     public void testGetByTheUser() throws ServiceException, RemoteException{  
  9.         //获取Service 对象-创建服务    
  10.         Service service=new Service();  
  11.           
  12.         //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  13.         Call call=(Call) service.createCall();    
  14.           
  15.         //设置远程调用桩-设置请求地址    
  16.         call.setTargetEndpointAddress(url);    
  17.           
  18.         //这里的QName的ns和wsdd文件中的对应  
  19.         QName qn = new QName("urn:TheUser""TheUser");  
  20.           
  21.         //这里是将对象序列化和反序列化的配置  
  22.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  23.          
  24.         //设置要调用的方法的名字  
  25.         call.setOperationName("getByTheUser");  
  26.           
  27.         call.addParameter("TheUser", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  28.         //设置返回值属性  
  29.         call.setReturnClass(TheUser.class);  
  30.           
  31.         TheUser theUser=new TheUser();  
  32.         theUser.setAge(10);  
  33.         theUser.setUsername("jecket");  
  34.           
  35.         TheUser theUser2=new TheUser();  
  36.         theUser2 = (TheUser)call.invoke(new Object[]{theUser});  
  37.         System.out.println("theUser2.name="+theUser2.getUsername());  
  38.         
  39.           
  40.     }  
  41.       
  42.     /** 
  43.      * 入参为List类型 
  44.      * @throws ServiceException 
  45.      * @throws RemoteException 
  46.      */  
  47.     @Test  
  48.     //@Ignore  
  49.     public void testGetByListTheUser() throws ServiceException, RemoteException{  
  50.         //获取Service 对象-创建服务    
  51.         Service service=new Service();  
  52.           
  53.         //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  54.         Call call=(Call) service.createCall();    
  55.           
  56.         //设置远程调用桩-设置请求地址    
  57.         call.setTargetEndpointAddress(url);    
  58.           
  59.         //这里的QName的ns和wsdd文件中的对应  
  60.         QName qn = new QName("urn:TheUser""TheUser");  
  61.           
  62.         //这里是将对象序列化和反序列化的配置  
  63.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  64.          
  65.         //设置要调用的方法的名字  
  66.         call.setOperationName("getByListTheUser");  
  67.           
  68.         call.addParameter("list", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  69.         //设置返回值属性  
  70.         call.setReturnClass(TheUser.class);  
  71.           
  72.         TheUser theUser=new TheUser();  
  73.         theUser.setAge(10);  
  74.         theUser.setUsername("jecket");  
  75.         List list=new ArrayList();  
  76.         list.add(theUser);  
  77.         TheUser theUser2=new TheUser();  
  78.         theUser2 = (TheUser)call.invoke(new Object[]{list});  
  79.         System.out.println("theUser2.name="+theUser2.getUsername());  
  80.         
  81.           
  82.     }  
  83.       
  84.     /** 
  85.      * 入参为Map类型 
  86.      * @throws ServiceException 
  87.      * @throws RemoteException 
  88.      */  
  89.     @Test  
  90.     //@Ignore  
  91.     public void testGetByMapTheUser() throws ServiceException, RemoteException{  
  92.         //获取Service 对象-创建服务    
  93.         Service service=new Service();  
  94.           
  95.         //通过 Service 对象获取远程调用对象Call-创建调用句柄    
  96.         Call call=(Call) service.createCall();    
  97.           
  98.         //设置远程调用桩-设置请求地址    
  99.         call.setTargetEndpointAddress(url);    
  100.           
  101.         //这里的QName的ns和wsdd文件中的对应  
  102.         QName qn = new QName("urn:TheUser""TheUser");  
  103.           
  104.         //这里是将对象序列化和反序列化的配置  
  105.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  106.          
  107.         //设置要调用的方法的名字  
  108.         call.setOperationName("getByMapTheUser");  
  109.           
  110.         call.addParameter("map", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  111.         //设置返回值属性  
  112.         call.setReturnClass(TheUser.class);  
  113.           
  114.         TheUser theUser=new TheUser();  
  115.         theUser.setAge(10);  
  116.         theUser.setUsername("jecket");  
  117.         Map map=new HashMap();  
  118.         map.put("theUser0", theUser);  
  119.         TheUser theUser2=new TheUser();  
  120.         theUser2 = (TheUser)call.invoke(new Object[]{map});  
  121.         System.out.println("theUser2.name="+theUser2.getUsername());  
  122.         
  123.           
  124.     }  


特别需要强调的是,在以实体类作为入参或者反参的时候,需要将建立的实体类序列化,即实体类是这样的,implements Serializable

[html]  view plain  copy
  1. import java.io.Serializable;  
  2.   
  3. public class TheUser implements Serializable {  
  4.   
  5.     /**  
  6.      * 提供序列化编号,远程调用时要用到  
  7.      */  
  8.     private static final long serialVersionUID = -971720598087640397L;  
  9.   
  10.     private String username;  
  11.     private int age;  
  12.     public String getUsername() {  
  13.         return username;  
  14.     }  
  15.     public void setUsername(String username) {  
  16.         this.username = username;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     @Override  
  25.     public String toString() {  
  26.         // TODO Auto-generated method stub  
  27.         return "username="+username+" ;age="+age;  
  28.     }  
  29.   
  30. }  






你可能感兴趣的:(WebService)