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,
javax.xml.rpc.ParameterMode.IN);//接口的參數
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設置返回類型 簡單類型的返回就可以這樣簡單操作,只要設置返回類型即可。甚至可以不設置返回類型。不設置返回類型操作方法請看2
Object xml;
try {
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
e.printStackTrace();
}
} 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爲傳入參數的變量名 字
call.addParameter(new QName("hoope.views.api.login_service.LoginService",
"pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裏的units爲傳入參數的變量名字
call.addParameter(new QName("hoope.views.api.login_service.LoginService",
"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) {
e.printStackTrace();
}
4。返回自定義數組對象
返回數組對象與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爲傳入參數的變量名 字
call.addParameter(new QName("hoope.views.api.login_service.LoginService",
"pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裏的units爲傳入參數的變量名字
call.addParameter(new QName("hoope.views.api.login_service.LoginService",
"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});//接口接收的參數
System.out.println("xljg="+itv);//打印輸出數組
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
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爲傳入參數的變量名字
call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" type " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裏的type爲傳入參數的變量名字
call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" start " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裏的start爲傳入參數的變量名字
call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" pagesize " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裏的pagesize爲傳入參數的變量名字
call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,
" 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) {
e.printStackTrace();
}
axis客戶端接收不同參數類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Python中numpy庫中 axis=0,axis= 1軸的詳解
ding_programmer
2020-07-04 17:00:46
Service service= new Service() 代碼這一行報錯處理辦法
宏阳love心
2020-06-23 19:08:04
利用Axis訪問rpc/encorded風格的Web Service
穷目楼
2020-06-22 03:33:58
運行ava org.apache.axis.client.AdminClient時找不到org.apache.commons.logging.LogFactory
五月树
2020-06-17 12:06:19
傳遞、返回複雜類型的對象(axis服務端/axis客戶端)
永恒信念-
2020-06-15 13:01:16
【Java】Axis1.4 操作文檔
kida_yuan
2020-06-13 21:35:55
R語言中Axis()函數的參數詳解
t4ngw
2020-05-11 02:06:28
小白都能看懂的numpy與pandas中axis解釋
bitcarmanlee
2020-04-20 13:34:56
Axis Header授權驗證
iteye_1599
2020-02-25 20:41:44
axis實現webservice服務
hao_kkkkk
2020-02-24 10:08:16
Axis Webservice Demo
wubin3347
2020-02-24 08:31:43
AXIS2遠程調用WebService示例(Eclipse+AXIS)
Mos_wen
2020-02-23 03:26:44
其他需要測試的實例
jeanjeanfang
2020-02-22 18:54:05
實例7:上傳下載文件
jeanjeanfang
2020-02-22 18:54:05