axis客戶端接收不同參數類型

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();  
         }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章