axis1.4釋出返回複雜型別的引數
1、為專案 webserviceAxis1 引入 axis1 必須的幾個jar包
2、建立實體類 TheUser.java 注意需要序列化即實現介面Serializable,這對於在webservice 中傳遞實體型別是必須的
TheUser.java 的內容如下
-
package com.demo.model;
-
import java.io.Serializable;
-
public class TheUser implements Serializable {
-
/**
-
* 提供序列化編號,遠端呼叫時要用到
-
*/
-
private static final long serialVersionUID = -971720598087640397L;
-
private String username;
-
private int age;
-
public String getUsername() {
-
return username;
-
}
-
public void setUsername(String username) {
-
this.username = username;
-
}
-
public int getAge() {
-
return age;
-
}
-
public void setAge(int age) {
-
this.age = age;
-
}
-
@Override
-
public String toString() {
-
// TODO Auto-generated method stub
-
return "username="+username+" ;age="+age;
-
}
-
}
3、然後是編寫webservice要釋出的方法所在的類 TheUserWsddAction.java
TheUserWsddAction.java 的程式碼如下:
-
package com.demo.action;
-
import java.util.ArrayList;
-
import java.util.LinkedHashMap;
-
import java.util.List;
-
import java.util.Map;
-
import javax.xml.registry.infomodel.User;
-
import com.demo.model.TheUser;
-
/**
-
* 提供webservice方法
-
* 將操作各種複雜的資料型別
-
* @author WuJieJecket
-
*
-
*/
-
public class TheUserWsddAction {
-
/**
-
* 提供一個簡單型別的方法,便於比對
-
* @param username
-
* @return
-
*/
-
public String getEasyEg(String username){
-
return "You write "+username;
-
}
-
/**
-
* webservice中僅返回一個實體型別
-
* @param username
-
* @param age
-
* @return TheUser
-
*/
-
public TheUser getTheUser(String username,int age){
-
TheUser theu=new TheUser();
-
theu.setUsername(username);
-
theu.setAge(age);
-
return theu;
-
}
-
/**
-
* webservice中返回 List<TheUser> 型別
-
* @param username
-
* @param length
-
* @return List TheUser
-
*/
-
public List<TheUser> getTheUserList(String username,int size){
-
List<TheUser> theuserlist=new ArrayList<TheUser>();
-
for(int i=0;i<size;i++){
-
TheUser tuser=new TheUser();
-
tuser.setUsername(username+size);
-
tuser.setAge(i);
-
theuserlist.add(tuser);
-
}
-
return theuserlist;
-
}
-
/**
-
* webservice中返回 User[]資料 型別
-
* @param username
-
* @param length
-
* @return User[]
-
*/
-
public TheUser[] getTheUserGroup(String username,int length){
-
TheUser[] usergroups =new TheUser[length];
-
for(int i=0;i<length;i++){
-
TheUser tuser=new TheUser();
-
tuser.setUsername(username+length);
-
tuser.setAge(i);
-
usergroups[i]=(TheUser) tuser;
-
}
-
return usergroups;
-
}
-
/**
-
* webservice中返回 Map<String,TheUser>資料 型別
-
* @return
-
*/
-
public Map<String,TheUser> getTheUserMap(){
-
Map<String, TheUser> theusermap=new LinkedHashMap<String, TheUser>();
-
TheUser tusera=new TheUser();
-
TheUser tuserb=new TheUser();
-
tusera.setAge(20);
-
tuserb.setAge(20);
-
tusera.setUsername("namea");
-
tuserb.setUsername("nameb");
-
theusermap.put("tusera", tusera);
-
theusermap.put("tuserb", tuserb);
-
return theusermap;
-
}
-
}
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檔案中
-
<?xml version="1.0" encoding="ISO-8859-1"?>
-
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
-
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
-
<web-app>
-
<display-name>Apache-Axis</display-name>
-
<listener>
-
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
-
</listener>
-
<servlet>
-
<servlet-name>AxisServlet</servlet-name>
-
<display-name>Apache-Axis Servlet</display-name>
-
<servlet-class>
-
org.apache.axis.transport.http.AxisServlet
-
</servlet-class>
-
</servlet>
-
<servlet>
-
<servlet-name>SOAPMonitorService</servlet-name>
-
<display-name>SOAPMonitorService</display-name>
-
<servlet-class>
-
org.apache.axis.monitor.SOAPMonitorService
-
</servlet-class>
-
<init-param>
-
<param-name>SOAPMonitorPort</param-name>
-
<param-value>5001</param-value>
-
</init-param>
-
<load-on-startup>100</load-on-startup>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>AxisServlet</servlet-name>
-
<url-pattern>/servlet/AxisServlet</url-pattern>
-
</servlet-mapping>
-
<servlet-mapping>
-
<servlet-name>AxisServlet</servlet-name>
-
<url-pattern>*.jws</url-pattern>
-
</servlet-mapping>
-
<servlet-mapping>
-
<servlet-name>AxisServlet</servlet-name>
-
<url-pattern>/services/*</url-pattern>
-
</servlet-mapping>
-
<servlet-mapping>
-
<servlet-name>SOAPMonitorService</servlet-name>
-
<url-pattern>/SOAPMonitor</url-pattern>
-
</servlet-mapping>
-
<!-- uncomment this if you want the admin servlet -->
-
<session-config>
-
<!-- Default to 5 minute session timeouts -->
-
<session-timeout>5</session-timeout>
-
</session-config>
-
<!-- currently the W3C havent settled on a media type for WSDL;
-
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
-
for now we go with the basic 'it's XML' response -->
-
<mime-mapping>
-
<extension>wsdl</extension>
-
<mime-type>text/xml</mime-type>
-
</mime-mapping>
-
<mime-mapping>
-
<extension>xsd</extension>
-
<mime-type>text/xml</mime-type>
-
</mime-mapping>
-
<welcome-file-list id="WelcomeFileList">
-
<welcome-file>index.jsp</welcome-file>
-
<welcome-file>index.html</welcome-file>
-
<welcome-file>index.jws</welcome-file>
-
</welcome-file-list>
-
</web-app>
5、編寫 wsdd 檔案,目錄是WEB-INF 目錄下
其實只需要一個載入服務的wsdd和一個去處服務的wsdd即可,我這裡有4個是自己做其他實驗用的(名字什麼不重要,必須是wsdd結尾)。
我做的一個實驗是看在一個wsdd檔案中是否可以同時釋出兩個service方法,所以添加了一個HelloWorldWSDD.java
HelloWorldWSDD.java 的內容如下
-
package com.demo.action;
-
/**
-
* Axis1
-
* WSDD釋出webservice 測試
-
* @author WuJieJecket
-
*
-
*/
-
public class HelloWorldWSDD {
-
/**
-
* 方法1
-
* param String name
-
* return "your name is "+name
-
*/
-
public String getName(String name){
-
return "Your name is "+name;
-
}
-
/**
-
* 方法2
-
* param int age
-
* return age+10
-
*/
-
public int getAge(int age){
-
return 10+age;
-
}
-
}
然後是wsdd 檔案
deployall.wsdd
-
<?xml version="1.0" encoding="UTF-8"?>
-
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
-
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
-
<service name="HelloWorldWSDD" provider="java:RPC">
-
<parameter name="className" value="com.demo.action.HelloWorldWSDD" />
-
<!-- 指定方法名暴露 -->
-
<parameter name="allowedMethods" value="getName" />
-
<parameter name="scope" value="request" />
-
</service>
-
<service name="TheUserWsddAction" provider="java:RPC">
-
<parameter name="className" value="com.demo.action.TheUserWsddAction" />
-
<!-- * 代表所有的方法都暴露 -->
-
<parameter name="allowedMethods" value="*" />
-
<parameter name="scope" value="request" />
-
<!-- 這裡的urn:TheUser和new QName("urn:TheUser", "TheUser")這裡是對應的 -->
-
<beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>
-
</service>
-
</deployment>
undeploy.wsdd
-
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
-
<service name="HelloWorldWSDD"/>
-
<service name="TheUserWsddAction"/>
-
</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
-
import java.rmi.RemoteException;
-
import java.util.Iterator;
-
import java.util.List;
-
import java.util.Map;
-
import javax.xml.namespace.QName;
-
import javax.xml.rpc.ParameterMode;
-
import javax.xml.rpc.ServiceException;
-
import localhost.webserviceAxis1.services.TheUserWsddAction.TheUser;
-
import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionService;
-
import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionServiceLocator;
-
import org.apache.axis.client.Call;
-
import org.apache.axis.client.Service;
-
import org.apache.axis.encoding.XMLType;
-
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
-
import org.apache.axis.encoding.ser.BeanSerializerFactory;
-
import org.junit.Ignore;
-
import org.junit.Test;
-
public class TheAxis1Test {
-
private static final String url="http://localhost:8080/webserviceAxis1/services/TheUserWsddAction";
-
/**
-
* 最簡單的,入參為一個 string , 反參為一個 string
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testgetEasyEg() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//設定遠端操作方法名
-
/**
-
* 設定呼叫的方法和方法的名稱空間;
-
* 因為這裡是手動釋出到webroot目錄下的,所以名稱空間和請求地址一致
-
* 當然null也可以,因為本身它就沒有設定名稱空間,一般方法的名稱空間是
-
* 包名倒寫組成,如com.hoo.service,ns=http://service.hoo.com
-
* getSayHello 是要呼叫的方法名
-
*/
-
call.setOperationName(new QName(null,"getEasyEg"));
-
//設定引數,執行遠端方法
-
String result=(String)call.invoke(new Object[]{"Jecket"});
-
System.out.println(result);
-
}
-
/**
-
* 入參為 String,int
-
* 反參為 TheUser
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
/**
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
/**
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testgetTheUser() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getTheUser");
-
/*
-
* 這裡客戶端和伺服器端共用一個User,在實際開發中
-
* 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣
-
* 需要我們根據WebService的wsdl分析物件的屬性
-
*/
-
call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);
-
call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);
-
call.setReturnClass(TheUser.class);
-
TheUser tuser = (TheUser) call.invoke(new Object[] {"Jecket",20});
-
System.out.println("你獲取了tuser ,名字是:"+tuser.getUsername()+" 年齡是 "+ tuser.getAge()+" 其他資訊 "+tuser.getClass());
-
}
-
/**
-
* 入參為 String , int
-
* 反參為 List<TheUser>
-
* @throws ServiceException
-
* @throws RemoteException
-
*
-
*/
-
@Test
-
//@Ignore
-
public void testgetTheUserList() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getTheUserList");
-
/*
-
* 這裡客戶端和伺服器端共用一個User,在實際開發中
-
* 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣
-
* 需要我們根據WebService的wsdl分析物件的屬性
-
*/
-
call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);
-
call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);
-
//設定返回值屬性
-
call.setReturnClass(List.class);
-
List<TheUser> tus = (List<TheUser>) call.invoke(new Object[] {"Jecket",20});
-
for(TheUser tu: tus){
-
System.out.println("呼叫 getTheUserList() 你獲取了tu ,名字是:"+tu.getUsername()+" 年齡是 "+ tu.getAge()+" 其他資訊 "+tu.getClass());
-
}
-
}
-
/**
-
* 入參為:String , int
-
* 反參為:陣列
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
/**
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testgetTheUserGroup() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getTheUserGroup");
-
/*
-
* 這裡客戶端和伺服器端共用一個User,在實際開發中
-
* 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣
-
* 需要我們根據WebService的wsdl分析物件的屬性
-
*/
-
call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);
-
call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);
-
//設定返回值屬性
-
call.setReturnClass(TheUser[].class);
-
TheUser[] tu=(TheUser[]) call.invoke(new Object[] {"Jecket",20});
-
for(TheUser tus:tu){
-
System.out.println("呼叫了getTheUserGroup() 方法 ,年齡:"+tus.getAge()+" 姓名:"+tus.getUsername()+" 所屬的類:"+tus.getClass());
-
}
-
//理解資料的型別
-
/*String[] a={"1","2"};
-
for(String b:a){
-
System.out.println(b);
-
}*/
-
}
-
@Test
-
//@Ignore
-
public void testgetTheUserMap() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getTheUserMap");
-
//設定返回值屬性
-
call.setReturnClass(Map.class);
-
Map<String, TheUser> maps = (Map<String, TheUser>) call.invoke(new Object[]{});
-
/*
-
TheUser ta=(TheUser)maps.get("tusera");
-
TheUser tb=(TheUser)maps.get("tuserb");
-
System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());
-
System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+tb.getAge()+" 姓名:"+tb.getUsername()+" 所屬的類:"+tb.getClass());
-
*/
-
//遍歷 Map 的方法
-
Iterator it=maps.keySet().iterator();
-
while(it.hasNext()){
-
TheUser ta=maps.get(it.next());
-
System.out.println("呼叫了getTheUserMap() 方法 ,年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());
-
}
-
}
-
/**
-
* 使用webservice客戶端進行呼叫
-
* 返回的物件都是 object
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testhere() throws ServiceException, RemoteException{
-
TheUserWsddActionService tuwas=new TheUserWsddActionServiceLocator();
-
localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddAction tuwa=tuwas.getTheUserWsddAction();
-
String r=tuwa.getEasyEg("nihao");
-
System.out.println(r);
-
Object[] a=tuwa.getTheUserList("Jecket", 10);
-
for(Object ob:a){
-
TheUser ta=(TheUser)ob;
-
System.out.println("年齡:"+ta.getAge()+" 姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());
-
}
-
}
-
}
10、以上的例子入參都是簡單的引數,比如String、int,如果是實體類、list等呢?
本例子為後續補充,不再贅述釋出過程,只寫出方法和呼叫方法
被呼叫的方法程式碼:
-
/**
-
* 入參為 實體類
-
* @param theUser
-
* @return
-
*/
-
public TheUser getByTheUser(TheUser theUser){
-
return theUser;
-
}
-
/**
-
* 入參為list型別
-
* @param list
-
* @return
-
*/
-
public TheUser getByListTheUser(List<TheUser> list){
-
return list.get(0);
-
}
-
/**
-
* 入參為map型別
-
* @param map
-
* @return
-
*/
-
public TheUser getByMapTheUser(Map<String,TheUser> map){
-
return map.get("theUser0");
-
}
呼叫webservice方法的程式碼
-
/**
-
* 入參為實體類
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testGetByTheUser() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getByTheUser");
-
call.addParameter("TheUser", XMLType.XSD_ANYTYPE, ParameterMode.IN);
-
//設定返回值屬性
-
call.setReturnClass(TheUser.class);
-
TheUser theUser=new TheUser();
-
theUser.setAge(10);
-
theUser.setUsername("jecket");
-
TheUser theUser2=new TheUser();
-
theUser2 = (TheUser)call.invoke(new Object[]{theUser});
-
System.out.println("theUser2.name="+theUser2.getUsername());
-
}
-
/**
-
* 入參為List型別
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testGetByListTheUser() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getByListTheUser");
-
call.addParameter("list", XMLType.XSD_ANYTYPE, ParameterMode.IN);
-
//設定返回值屬性
-
call.setReturnClass(TheUser.class);
-
TheUser theUser=new TheUser();
-
theUser.setAge(10);
-
theUser.setUsername("jecket");
-
List<TheUser> list=new ArrayList<TheUser>();
-
list.add(theUser);
-
TheUser theUser2=new TheUser();
-
theUser2 = (TheUser)call.invoke(new Object[]{list});
-
System.out.println("theUser2.name="+theUser2.getUsername());
-
}
-
/**
-
* 入參為Map型別
-
* @throws ServiceException
-
* @throws RemoteException
-
*/
-
@Test
-
//@Ignore
-
public void testGetByMapTheUser() throws ServiceException, RemoteException{
-
//獲取Service 物件-建立服務
-
Service service=new Service();
-
//通過 Service 物件獲取遠端呼叫物件Call-建立呼叫控制代碼
-
Call call=(Call) service.createCall();
-
//設定遠端呼叫樁-設定請求地址
-
call.setTargetEndpointAddress(url);
-
//這裡的QName的ns和wsdd檔案中的對應
-
QName qn = new QName("urn:TheUser", "TheUser");
-
//這裡是將物件序列化和反序列化的配置
-
call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);
-
//設定要呼叫的方法的名字
-
call.setOperationName("getByMapTheUser");
-
call.addParameter("map", XMLType.XSD_ANYTYPE, ParameterMode.IN);
-
//設定返回值屬性
-
call.setReturnClass(TheUser.class);
-
TheUser theUser=new TheUser();
-
theUser.setAge(10);
-
theUser.setUsername("jecket");
-
Map<String,TheUser> map=new HashMap<String,TheUser>();
-
map.put("theUser0", theUser);
-
TheUser theUser2=new TheUser();
-
theUser2 = (TheUser)call.invoke(new Object[]{map});
-
System.out.println("theUser2.name="+theUser2.getUsername());
-
}
特別需要強調的是,在以實體類作為入參或者反參的時候,需要將建立的實體類序列化,即實體類是這樣的,implements Serializable
-
import java.io.Serializable;
-
public class TheUser implements Serializable {
-
/**
-
* 提供序列化編號,遠端呼叫時要用到
-
*/
-
private static final long serialVersionUID = -971720598087640397L;
-
private String username;
-
private int age;
-
public String getUsername() {
-
return username;
-
}
-
public void setUsername(String username) {
-
this.username = username;
-
}
-
public int getAge() {
-
return age;
-
}
-
public void setAge(int age) {
-
this.age = age;
-
}
-
@Override
-
public String toString() {
-
// TODO Auto-generated method stub
-
return "username="+username+" ;age="+age;
-
}
-
}