axis隻支援簡單類型的傳回值。在這裡逐一介紹axis的各種傳回值接受。
1:axis接受基本類型,如int ,string等
引入的系統檔案:
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
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;
Service service = new Service();//建立service對象
Call call;
try {
call = (Call) service.createCall();//得到Call對象
try {
call.setTargetEndpointAddress(new java.net.URL(Constants.sns_sms_service));//将要通路的接口位址,将接口位址加上?wsdl在浏覽器中通路就可以檢視到wsdl檔案的資訊,以及你所需要的參數名稱等。
} catch (MalformedURLException e) {
e.printStackTrace();
}
call.setOperationName("sendSms");//WSDL 裡面描述的接口名稱
call.getMessageContext().setUsername(Constants.sns_httpbase_username);//http 認證使用者名
call.getMessageContext().setPassword(Constants.sns_httpbase_password);//http 認證密碼
call.addParameter("sendnum", org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);//接口的參數 sendnum 為String類型。addParameter()第一個參數是參數的名稱與wsdl中相對應必須相同。第二個參數是參數的類型 。也必須與wsdl相同。
call.addParameter("acceptnums", org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);//接口的參數
call.addParameter("smscnt", org.apache.axis.encoding.XMLType.XSD_STRING,
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設定傳回類型 簡單類型的傳回就可以這樣簡單操作,隻要設定傳回類型即可。甚至可以不設定傳回類型。不設定傳回類型操作方法請看2
Object xml;
xml = (Object)call.invoke(new Object[]{send,reving,content});//參數的順序與addParameter的順序相同,且設定了 addParmaters就必須setRuturnType傳回值
//給方法傳遞參數,并且調用方法
System.out.println("result is "+xml);
} catch (RemoteException e) {
// TODO Auto-generated catch block
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2.不設定傳回類型的簡單類型傳回值。
Service和Call的建立都與1相同。
call = (Call) service.createCall();
call.setOperationName(new QName(url, "getIByusername"));//getByusername是服務端接口的方法名稱url是接口位址
call.setTargetEndpointAddress(new java.net.URL(url));//接口位址
Object o = call.invoke(new Object[] { account ,IP, mcode });//這裡直接傳入參數,但是需要注意的是,傳入的參數順序必須與wsdl順序相同,且類型相同。可以接收一個map的對象。
3.。傳回值為自定義對象
try{
String url = Constants.sns_login_service;
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(url, "Login"));//Login為要調用的方法名
// hoope.views.api.login_service.LoginService為 wsdl中 targetNamespace 的值 以下相同
call.addParameter(new QName("hoope.views.api.login_service.LoginService",
"username"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的username為傳入參數的變量名字
"pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的units為傳入參數的變量名字
"code"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的code為傳入參數的變量名字
call.setReturnType(new QName("hoope.views.api.login_service.LoginService",
"response"), ITVAccount.class);//ITVAccount這裡是重點,傳回時主要在這配置,ITVAccount為傳回的對象
// 注冊映射關系
QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此處的 LoginInfoDict為WSDL檔案中complexType name的屬性值
//這裡注冊映射關系,對自定義的類進行序列化與反序列化。
call.registerTypeMapping(ITVAccount.class, XljgInfo,
new BeanSerializerFactory(ITVAccount.class, XljgInfo),
new BeanDeserializerFactory(ITVAccount.class, XljgInfo));//ITVAccount.class同上,
ITVAccount itv =(ITVAccount) call.invoke(new Object[] {account,pwd,code});//接口接收的參數
if(itv!=null){
itv.setNickName(itv.getNickname());
itv.setUserName(itv.getUsername());
itv.setMobilePhone(itv.getUserphone());
}
System.out.println("xljg="+itv);//列印輸出對象
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
}
4。傳回自定義數組對象
傳回數組對象與3相似,隻要将注冊傳回類型為數組即可。
"response"), ITVAccount[].class );//ITVAccount 這裡是重點,傳回時主要在這配置,ITVAccount為傳回數組對象
call.registerTypeMapping(ITVAccount[].class , XljgInfo,
new BeanSerializerFactory(ITVAccount[]. class, XljgInfo),
new BeanDeserializerFactory(ITVAccount[]. class, XljgInfo));//ITVAccount.class同上,
ITVAccount[] itv =(ITVAccount[]) call.invoke(new Object[] {account,pwd,code});//接口接收的參數
System.out.println("xljg="+itv);//列印輸出數組
}
5。傳回值為對象中包含對象及對象中包含數組
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName( new QName(url, " seachRelateUserInfo " )); // seachRelateUserInfo為要調用的方法名
call.getMessageContext().setUsername( " admin " ); // httpbase認證使用者名
call.getMessageContext().setPassword( " admin " ); // httpbase認證密碼
// hoope.views.api.userinfo_service.UserInfoWebService 為 wsdl中 targetNamespace 的值 以下相同
call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" condition " ),XMLType.SOAP_STRING,ParameterMode.IN); // 這裡的condition為傳入參數的變量名字
" type " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的type為傳入參數的變量名字
" start " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的start為傳入參數的變量名字
" pagesize " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的pagesize為傳入參數的變量名字
" checkcode " ),XMLType.SOAP_STRING,ParameterMode.IN); // 這裡的checkcode為傳入參數的變量名字
call.setReturnType( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" response " ), MapInfoDict. class ); // 這裡設定傳回值的類型
// 注冊映射關系 // 此處的MapInfoDict userInfoDictArray userInfoDict為WSDL檔案中complexType name的屬性值 首先找到傳回對象的complexType再看它中是否有其他的對象類型自定義對象類型,然後依次映射。
// 這裡傳回對象的complexType為MapInfoDict,MapInfoDict中有一個userInfoDictArray的對象,userInfoDictArray的對象中有一個List<UserInfoDict>的集合。
// 問題就在這裡,這個集合擷取不到。
QName XljgInfo = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " MapInfoDict " );
QName XljgInfo2 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDictArray " );
QName XljgInfo3 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDict " );
// 為自定義類型進行序列化和反序列化。必須與上面定義的QName比對。它與服務端傳回的類型做映射比對。
call.registerTypeMapping(MapInfoDict. class , XljgInfo,
new BeanSerializerFactory(MapInfoDict. class , XljgInfo),
new BeanDeserializerFactory(MapInfoDict. class , XljgInfo));
call.registerTypeMapping(UserInfoDictArray. class , XljgInfo2,
new BeanSerializerFactory(UserInfoDictArray. class , XljgInfo2),
new BeanDeserializerFactory(UserInfoDictArray. class , XljgInfo2));
//對 UserInfoDictArray中存在的是對象,則直接對對象進行序列化與反序列話即可。但如果UserInfoDictArray中的是List該如何去映射呢?該如何序列化呢?還沒找到實作方法。待解決中。。。望高人指點。
call.registerTypeMapping(UserInfoDict. class , XljgInfo3,
new BeanSerializerFactory(UserInfoDict. class , XljgInfo3),
new BeanDeserializerFactory(UserInfoDict. class , XljgInfo3));[ / color]
MapInfoDict xljg = (MapInfoDict) call.invoke( new Object[] {parm, " 1 " , " 1 " , " 20 " , " itv " }); // 執行調用服務接口
System.out.println( " xljg= " + xljg); // 列印輸出
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
}