axis客户端接收不同参数类型

时间:2022-06-19 21:15:59

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(); 
         }  
   -----------------------------------------------------望对学习者有所帮助------------------------------------------------------------------