1. 程式人生 > >axis1.4釋出返回複雜型別的引數

axis1.4釋出返回複雜型別的引數

1、為專案 webserviceAxis1 引入 axis1 必須的幾個jar包

2、建立實體類 TheUser.java  注意需要序列化即實現介面Serializable,這對於在webservice 中傳遞實體型別是必須的

TheUser.java 的內容如下

  1. package com.demo.model;

  2. import java.io.Serializable;

  3. public class TheUser implements Serializable {

  4. /**

  5. * 提供序列化編號,遠端呼叫時要用到

  6. */

  7. private static final long serialVersionUID = -971720598087640397L;

  8. private String username;

  9. private int age;

  10. public String getUsername() {

  11. return username;

  12. }

  13. public void setUsername(String username) {

  14. this.username = username;

  15. }

  16. public int getAge() {

  17. return age;

  18. }

  19. public void setAge(int age) {

  20. this.age = age;

  21. }

  22. @Override

  23. public String toString() {

  24. // TODO Auto-generated method stub

  25. return "username="+username+" ;age="+age;

  26. }

  27. }

3、然後是編寫webservice要釋出的方法所在的類 TheUserWsddAction.java

TheUserWsddAction.java 的程式碼如下:

  1. package com.demo.action;

  2. import java.util.ArrayList;

  3. import java.util.LinkedHashMap;

  4. import java.util.List;

  5. import java.util.Map;

  6. import javax.xml.registry.infomodel.User;

  7. import com.demo.model.TheUser;

  8. /**

  9. * 提供webservice方法

  10. * 將操作各種複雜的資料型別

  11. * @author WuJieJecket

  12. *

  13. */

  14. public class TheUserWsddAction {

  15. /**

  16. * 提供一個簡單型別的方法,便於比對

  17. * @param username

  18. * @return

  19. */

  20. public String getEasyEg(String username){

  21. return "You write "+username;

  22. }

  23. /**

  24. * webservice中僅返回一個實體型別

  25. * @param username

  26. * @param age

  27. * @return TheUser

  28. */

  29. public TheUser getTheUser(String username,int age){

  30. TheUser theu=new TheUser();

  31. theu.setUsername(username);

  32. theu.setAge(age);

  33. return theu;

  34. }

  35. /**

  36. * webservice中返回 List<TheUser> 型別

  37. * @param username

  38. * @param length

  39. * @return List TheUser

  40. */

  41. public List<TheUser> getTheUserList(String username,int size){

  42. List<TheUser> theuserlist=new ArrayList<TheUser>();

  43. for(int i=0;i<size;i++){

  44. TheUser tuser=new TheUser();

  45. tuser.setUsername(username+size);

  46. tuser.setAge(i);

  47. theuserlist.add(tuser);

  48. }

  49. return theuserlist;

  50. }

  51. /**

  52. * webservice中返回 User[]資料 型別

  53. * @param username

  54. * @param length

  55. * @return User[]

  56. */

  57. public TheUser[] getTheUserGroup(String username,int length){

  58. TheUser[] usergroups =new TheUser[length];

  59. for(int i=0;i<length;i++){

  60. TheUser tuser=new TheUser();

  61. tuser.setUsername(username+length);

  62. tuser.setAge(i);

  63. usergroups[i]=(TheUser) tuser;

  64. }

  65. return usergroups;

  66. }

  67. /**

  68. * webservice中返回 Map<String,TheUser>資料 型別

  69. * @return

  70. */

  71. public Map<String,TheUser> getTheUserMap(){

  72. Map<String, TheUser> theusermap=new LinkedHashMap<String, TheUser>();

  73. TheUser tusera=new TheUser();

  74. TheUser tuserb=new TheUser();

  75. tusera.setAge(20);

  76. tuserb.setAge(20);

  77. tusera.setUsername("namea");

  78. tuserb.setUsername("nameb");

  79. theusermap.put("tusera", tusera);

  80. theusermap.put("tuserb", tuserb);

  81. return theusermap;

  82. }

  83. }

4、為了把webservice服務釋出出去,我們需要修改專案的web.xml 的內容,具體參考

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

    8、在自己的專案中使用WSDD方式釋出webservice服務,如其所言

如果你還記得axis 這個專案,把他的web.xml檔案找出來,複製裡面的內容,替換掉helloworld的web.xml (頭部可以保留編碼格式<?xml version="1.0" encoding="UTF-8"?>,內部的AdminServlet可以註釋掉,儘管沒有啥影響)

這裡我把我的專案的檔案貼出來,如果你看的看上面的文章,可以直接複製貼上到你的web.xml檔案中

  1. <?xml version="1.0" encoding="ISO-8859-1"?>

  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web

  3. Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

  4. <web-app>

  5. <display-name>Apache-Axis</display-name>

  6. <listener>

  7. <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>

  8. </listener>

  9. <servlet>

  10. <servlet-name>AxisServlet</servlet-name>

  11. <display-name>Apache-Axis Servlet</display-name>

  12. <servlet-class>

  13. org.apache.axis.transport.http.AxisServlet

  14. </servlet-class>

  15. </servlet>

  16. <servlet>

  17. <servlet-name>SOAPMonitorService</servlet-name>

  18. <display-name>SOAPMonitorService</display-name>

  19. <servlet-class>

  20. org.apache.axis.monitor.SOAPMonitorService

  21. </servlet-class>

  22. <init-param>

  23. <param-name>SOAPMonitorPort</param-name>

  24. <param-value>5001</param-value>

  25. </init-param>

  26. <load-on-startup>100</load-on-startup>

  27. </servlet>

  28. <servlet-mapping>

  29. <servlet-name>AxisServlet</servlet-name>

  30. <url-pattern>/servlet/AxisServlet</url-pattern>

  31. </servlet-mapping>

  32. <servlet-mapping>

  33. <servlet-name>AxisServlet</servlet-name>

  34. <url-pattern>*.jws</url-pattern>

  35. </servlet-mapping>

  36. <servlet-mapping>

  37. <servlet-name>AxisServlet</servlet-name>

  38. <url-pattern>/services/*</url-pattern>

  39. </servlet-mapping>

  40. <servlet-mapping>

  41. <servlet-name>SOAPMonitorService</servlet-name>

  42. <url-pattern>/SOAPMonitor</url-pattern>

  43. </servlet-mapping>

  44. <!-- uncomment this if you want the admin servlet -->

  45. <session-config>

  46. <!-- Default to 5 minute session timeouts -->

  47. <session-timeout>5</session-timeout>

  48. </session-config>

  49. <!-- currently the W3C havent settled on a media type for WSDL;

  50. http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft

  51. for now we go with the basic 'it's XML' response -->

  52. <mime-mapping>

  53. <extension>wsdl</extension>

  54. <mime-type>text/xml</mime-type>

  55. </mime-mapping>

  56. <mime-mapping>

  57. <extension>xsd</extension>

  58. <mime-type>text/xml</mime-type>

  59. </mime-mapping>

  60. <welcome-file-list id="WelcomeFileList">

  61. <welcome-file>index.jsp</welcome-file>

  62. <welcome-file>index.html</welcome-file>

  63. <welcome-file>index.jws</welcome-file>

  64. </welcome-file-list>

  65. </web-app>

5、編寫 wsdd 檔案,目錄是WEB-INF 目錄下

其實只需要一個載入服務的wsdd和一個去處服務的wsdd即可,我這裡有4個是自己做其他實驗用的(名字什麼不重要,必須是wsdd結尾)。

我做的一個實驗是看在一個wsdd檔案中是否可以同時釋出兩個service方法,所以添加了一個HelloWorldWSDD.java

HelloWorldWSDD.java 的內容如下

  1. package com.demo.action;

  2. /**

  3. * Axis1

  4. * WSDD釋出webservice 測試

  5. * @author WuJieJecket

  6. *

  7. */

  8. public class HelloWorldWSDD {

  9. /**

  10. * 方法1

  11. * param String name

  12. * return "your name is "+name

  13. */

  14. public String getName(String name){

  15. return "Your name is "+name;

  16. }

  17. /**

  18. * 方法2

  19. * param int age

  20. * return age+10

  21. */

  22. public int getAge(int age){

  23. return 10+age;

  24. }

  25. }

然後是wsdd 檔案

deployall.wsdd

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/"

  3. xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  4. <service name="HelloWorldWSDD" provider="java:RPC">

  5. <parameter name="className" value="com.demo.action.HelloWorldWSDD" />

  6. <!-- 指定方法名暴露 -->

  7. <parameter name="allowedMethods" value="getName" />

  8. <parameter name="scope" value="request" />

  9. </service>

  10. <service name="TheUserWsddAction" provider="java:RPC">

  11. <parameter name="className" value="com.demo.action.TheUserWsddAction" />

  12. <!-- * 代表所有的方法都暴露 -->

  13. <parameter name="allowedMethods" value="*" />

  14. <parameter name="scope" value="request" />

  15. <!-- 這裡的urn:TheUser和new QName("urn:TheUser", "TheUser")這裡是對應的 -->

  16. <beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>

  17. </service>

  18. </deployment>

undeploy.wsdd

  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">

  2. <service name="HelloWorldWSDD"/>

  3. <service name="TheUserWsddAction"/>

  4. </undeployment>

6、啟動服務,為了更為真實的實現那種效果,我把目前的專案打了war包,丟到了本地的tomcat伺服器

然後在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

如下就成功了

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

8、將客戶端程式碼複製到另外的一個專案中,同時需要引入那8個jar包

你會發現,相較而言,多了一個TheUser.java 當然這個類的位置你是可以自己決定的

因為本次釋出的webservice方法含有複雜的返回型別

然後對程式碼做一點更改,即報錯的地方有兩種

一個是 TheUser_pkg.TheUser 改為TheUser

另一個是org.apache.xml.xml_soap.MapItem.class;改為  Map.class

9.最後是測試類

TheAxis1Test.java

  1. import java.rmi.RemoteException;

  2. import java.util.Iterator;

  3. import java.util.List;

  4. import java.util.Map;

  5. import javax.xml.namespace.QName;

  6. import javax.xml.rpc.ParameterMode;

  7. import javax.xml.rpc.ServiceException;

  8. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUser;

  9. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionService;

  10. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionServiceLocator;

  11. import org.apache.axis.client.Call;

  12. import org.apache.axis.client.Service;

  13. import org.apache.axis.encoding.XMLType;

  14. import org.apache.axis.encoding.ser.BeanDeserializerFactory;

  15. import org.apache.axis.encoding.ser.BeanSerializerFactory;

  16. import org.junit.Ignore;

  17. import org.junit.Test;

  18. public class TheAxis1Test {

  19. private static final String url="http://localhost:8080/webserviceAxis1/services/TheUserWsddAction";

  20. /**

  21. * 最簡單的,入參為一個 string , 反參為一個 string

  22. * @throws ServiceException

  23. * @throws RemoteException

  24. */

  25. @Test

  26. //@Ignore

  27. public void testgetEasyEg() throws ServiceException, RemoteException{

  28. //獲取Service 物件-建立服務

  29. Service service=new Service();

  30. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  31. Call call=(Call) service.createCall();

  32. //設定遠端呼叫樁-設定請求地址

  33. call.setTargetEndpointAddress(url);

  34. //設定遠端操作方法名

  35. /**

  36. * 設定呼叫的方法和方法的名稱空間;

  37. * 因為這裡是手動釋出到webroot目錄下的,所以名稱空間和請求地址一致

  38. * 當然null也可以,因為本身它就沒有設定名稱空間,一般方法的名稱空間是

  39. * 包名倒寫組成,如com.hoo.service,ns=http://service.hoo.com

  40. * getSayHello 是要呼叫的方法名

  41. */

  42. call.setOperationName(new QName(null,"getEasyEg"));

  43. //設定引數,執行遠端方法

  44. String result=(String)call.invoke(new Object[]{"Jecket"});

  45. System.out.println(result);

  46. }

  47. /**

  48. * 入參為 String,int

  49. * 反參為 TheUser

  50. * @throws ServiceException

  51. * @throws RemoteException

  52. */

  53. /**

  54. * @throws ServiceException

  55. * @throws RemoteException

  56. */

  57. /**

  58. * @throws ServiceException

  59. * @throws RemoteException

  60. */

  61. @Test

  62. //@Ignore

  63. public void testgetTheUser() throws ServiceException, RemoteException{

  64. //獲取Service 物件-建立服務

  65. Service service=new Service();

  66. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  67. Call call=(Call) service.createCall();

  68. //設定遠端呼叫樁-設定請求地址

  69. call.setTargetEndpointAddress(url);

  70. //這裡的QName的ns和wsdd檔案中的對應

  71. QName qn = new QName("urn:TheUser", "TheUser");

  72. //這裡是將物件序列化和反序列化的配置

  73. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  74. //設定要呼叫的方法的名字

  75. call.setOperationName("getTheUser");

  76. /*

  77. * 這裡客戶端和伺服器端共用一個User,在實際開發中

  78. * 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣

  79. * 需要我們根據WebService的wsdl分析物件的屬性

  80. */

  81. call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);

  82. call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);

  83. call.setReturnClass(TheUser.class);

  84. TheUser tuser = (TheUser) call.invoke(new Object[] {"Jecket",20});

  85. System.out.println("你獲取了tuser ,名字是:"+tuser.getUsername()+" 年齡是 "+ tuser.getAge()+" 其他資訊 "+tuser.getClass());

  86. }

  87. /**

  88. * 入參為 String , int

  89. * 反參為 List<TheUser>

  90. * @throws ServiceException

  91. * @throws RemoteException

  92. *

  93. */

  94. @Test

  95. //@Ignore

  96. public void testgetTheUserList() throws ServiceException, RemoteException{

  97. //獲取Service 物件-建立服務

  98. Service service=new Service();

  99. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  100. Call call=(Call) service.createCall();

  101. //設定遠端呼叫樁-設定請求地址

  102. call.setTargetEndpointAddress(url);

  103. //這裡的QName的ns和wsdd檔案中的對應

  104. QName qn = new QName("urn:TheUser", "TheUser");

  105. //這裡是將物件序列化和反序列化的配置

  106. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  107. //設定要呼叫的方法的名字

  108. call.setOperationName("getTheUserList");

  109. /*

  110. * 這裡客戶端和伺服器端共用一個User,在實際開發中

  111. * 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣

  112. * 需要我們根據WebService的wsdl分析物件的屬性

  113. */

  114. call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);

  115. call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);

  116. //設定返回值屬性

  117. call.setReturnClass(List.class);

  118. List<TheUser> tus = (List<TheUser>) call.invoke(new Object[] {"Jecket",20});

  119. for(TheUser tu: tus){

  120. System.out.println("呼叫 getTheUserList() 你獲取了tu ,名字是:"+tu.getUsername()+" 年齡是 "+ tu.getAge()+" 其他資訊 "+tu.getClass());

  121. }

  122. }

  123. /**

  124. * 入參為:String , int

  125. * 反參為:陣列

  126. * @throws ServiceException

  127. * @throws RemoteException

  128. */

  129. /**

  130. * @throws ServiceException

  131. * @throws RemoteException

  132. */

  133. @Test

  134. //@Ignore

  135. public void testgetTheUserGroup() throws ServiceException, RemoteException{

  136. //獲取Service 物件-建立服務

  137. Service service=new Service();

  138. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  139. Call call=(Call) service.createCall();

  140. //設定遠端呼叫樁-設定請求地址

  141. call.setTargetEndpointAddress(url);

  142. //這裡的QName的ns和wsdd檔案中的對應

  143. QName qn = new QName("urn:TheUser", "TheUser");

  144. //這裡是將物件序列化和反序列化的配置

  145. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  146. //設定要呼叫的方法的名字

  147. call.setOperationName("getTheUserGroup");

  148. /*

  149. * 這裡客戶端和伺服器端共用一個User,在實際開發中

  150. * 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣

  151. * 需要我們根據WebService的wsdl分析物件的屬性

  152. */

  153. call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);

  154. call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);

  155. //設定返回值屬性

  156. call.setReturnClass(TheUser[].class);

  157. TheUser[] tu=(TheUser[]) call.invoke(new Object[] {"Jecket",20});

  158. for(TheUser tus:tu){

  159. System.out.println("呼叫了getTheUserGroup() 方法 ,年齡:"+tus.getAge()+" 姓名:"+tus.getUsername()+" 所屬的類:"+tus.getClass());

  160. }

  161. //理解資料的型別

  162. /*String[] a={"1","2"};

  163. for(String b:a){

  164. System.out.println(b);

  165. }*/

  166. }

  167. @Test

  168. //@Ignore

  169. public void testgetTheUserMap() throws ServiceException, RemoteException{

  170. //獲取Service 物件-建立服務

  171. Service service=new Service();

  172. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  173. Call call=(Call) service.createCall();

  174. //設定遠端呼叫樁-設定請求地址

  175. call.setTargetEndpointAddress(url);

  176. //這裡的QName的ns和wsdd檔案中的對應

  177. QName qn = new QName("urn:TheUser", "TheUser");

  178. //這裡是將物件序列化和反序列化的配置

  179. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  180. //設定要呼叫的方法的名字

  181. call.setOperationName("getTheUserMap");

  182. //設定返回值屬性

  183. call.setReturnClass(Map.class);

  184. Map<String, TheUser> maps = (Map<String, TheUser>) call.invoke(new Object[]{});

  185. /*

  186. TheUser ta=(TheUser)maps.get("tusera");

  187. TheUser tb=(TheUser)maps.get("tuserb");

  188. System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());

  189. System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+tb.getAge()+" 姓名:"+tb.getUsername()+" 所屬的類:"+tb.getClass());

  190. */

  191. //遍歷 Map 的方法

  192. Iterator it=maps.keySet().iterator();

  193. while(it.hasNext()){

  194. TheUser ta=maps.get(it.next());

  195. System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());

  196. }

  197. }

  198. /**

  199. * 使用webservice客戶端進行呼叫

  200. * 返回的物件都是 object

  201. * @throws ServiceException

  202. * @throws RemoteException

  203. */

  204. @Test

  205. //@Ignore

  206. public void testhere() throws ServiceException, RemoteException{

  207. TheUserWsddActionService tuwas=new TheUserWsddActionServiceLocator();

  208. localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddAction tuwa=tuwas.getTheUserWsddAction();

  209. String r=tuwa.getEasyEg("nihao");

  210. System.out.println(r);

  211. Object[] a=tuwa.getTheUserList("Jecket", 10);

  212. for(Object ob:a){

  213. TheUser ta=(TheUser)ob;

  214. System.out.println("年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());

  215. }

  216. }

  217. }

10、以上的例子入參都是簡單的引數,比如String、int,如果是實體類、list等呢?

本例子為後續補充,不再贅述釋出過程,只寫出方法和呼叫方法

被呼叫的方法程式碼:

  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<TheUser> list){

  15. return list.get(0);

  16. }

  17. /**

  18. * 入參為map型別

  19. * @param map

  20. * @return

  21. */

  22. public TheUser getByMapTheUser(Map<String,TheUser> map){

  23. return map.get("theUser0");

  24. }

呼叫webservice方法的程式碼

  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. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  12. Call call=(Call) service.createCall();

  13. //設定遠端呼叫樁-設定請求地址

  14. call.setTargetEndpointAddress(url);

  15. //這裡的QName的ns和wsdd檔案中的對應

  16. QName qn = new QName("urn:TheUser", "TheUser");

  17. //這裡是將物件序列化和反序列化的配置

  18. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  19. //設定要呼叫的方法的名字

  20. call.setOperationName("getByTheUser");

  21. call.addParameter("TheUser", XMLType.XSD_ANYTYPE, ParameterMode.IN);

  22. //設定返回值屬性

  23. call.setReturnClass(TheUser.class);

  24. TheUser theUser=new TheUser();

  25. theUser.setAge(10);

  26. theUser.setUsername("jecket");

  27. TheUser theUser2=new TheUser();

  28. theUser2 = (TheUser)call.invoke(new Object[]{theUser});

  29. System.out.println("theUser2.name="+theUser2.getUsername());

  30. }

  31. /**

  32. * 入參為List型別

  33. * @throws ServiceException

  34. * @throws RemoteException

  35. */

  36. @Test

  37. //@Ignore

  38. public void testGetByListTheUser() throws ServiceException, RemoteException{

  39. //獲取Service 物件-建立服務

  40. Service service=new Service();

  41. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  42. Call call=(Call) service.createCall();

  43. //設定遠端呼叫樁-設定請求地址

  44. call.setTargetEndpointAddress(url);

  45. //這裡的QName的ns和wsdd檔案中的對應

  46. QName qn = new QName("urn:TheUser", "TheUser");

  47. //這裡是將物件序列化和反序列化的配置

  48. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  49. //設定要呼叫的方法的名字

  50. call.setOperationName("getByListTheUser");

  51. call.addParameter("list", XMLType.XSD_ANYTYPE, ParameterMode.IN);

  52. //設定返回值屬性

  53. call.setReturnClass(TheUser.class);

  54. TheUser theUser=new TheUser();

  55. theUser.setAge(10);

  56. theUser.setUsername("jecket");

  57. List<TheUser> list=new ArrayList<TheUser>();

  58. list.add(theUser);

  59. TheUser theUser2=new TheUser();

  60. theUser2 = (TheUser)call.invoke(new Object[]{list});

  61. System.out.println("theUser2.name="+theUser2.getUsername());

  62. }

  63. /**

  64. * 入參為Map型別

  65. * @throws ServiceException

  66. * @throws RemoteException

  67. */

  68. @Test

  69. //@Ignore

  70. public void testGetByMapTheUser() throws ServiceException, RemoteException{

  71. //獲取Service 物件-建立服務

  72. Service service=new Service();

  73. //通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼

  74. Call call=(Call) service.createCall();

  75. //設定遠端呼叫樁-設定請求地址

  76. call.setTargetEndpointAddress(url);

  77. //這裡的QName的ns和wsdd檔案中的對應

  78. QName qn = new QName("urn:TheUser", "TheUser");

  79. //這裡是將物件序列化和反序列化的配置

  80. call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);

  81. //設定要呼叫的方法的名字

  82. call.setOperationName("getByMapTheUser");

  83. call.addParameter("map", XMLType.XSD_ANYTYPE, ParameterMode.IN);

  84. //設定返回值屬性

  85. call.setReturnClass(TheUser.class);

  86. TheUser theUser=new TheUser();

  87. theUser.setAge(10);

  88. theUser.setUsername("jecket");

  89. Map<String,TheUser> map=new HashMap<String,TheUser>();

  90. map.put("theUser0", theUser);

  91. TheUser theUser2=new TheUser();

  92. theUser2 = (TheUser)call.invoke(new Object[]{map});

  93. System.out.println("theUser2.name="+theUser2.getUsername());

  94. }

特別需要強調的是,在以實體類作為入參或者反參的時候,需要將建立的實體類序列化,即實體類是這樣的,implements Serializable

  1. import java.io.Serializable;

  2. public class TheUser implements Serializable {

  3. /**

  4. * 提供序列化編號,遠端呼叫時要用到

  5. */

  6. private static final long serialVersionUID = -971720598087640397L;

  7. private String username;

  8. private int age;

  9. public String getUsername() {

  10. return username;

  11. }

  12. public void setUsername(String username) {

  13. this.username = username;

  14. }

  15. public int getAge() {

  16. return age;

  17. }

  18. public void setAge(int age) {

  19. this.age = age;

  20. }

  21. @Override

  22. public String toString() {

  23. // TODO Auto-generated method stub

  24. return "username="+username+" ;age="+age;

  25. }

  26. }