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

简介: axis只支持简单类型的返回值。在这里逐一介绍axis的各种返回值接受。1:axis接受基本类型,如int ,string等引入的系统文件:import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import javax.xml.rpc.ServiceException;

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();

        }

 


相关文章
|
SQL 数据可视化 前端开发
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
2015 0
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
|
Java Maven 开发者
"揭秘IDEA的神奇助手:Maven Helper插件,让你轻松驾驭复杂依赖,告别冲突噩梦!"
【8月更文挑战第20天】Maven Helper是一款提升Java开发者工作效率的IDEA插件,它能直观展示项目依赖关系并协助管理。主要功能包括依赖树视图、冲突检测与解决及依赖排除。安装简便,重启IDEA后即用。借助其“Dependencies”面板,开发者可以清晰了解依赖详情,快速定位并解决冲突问题,有效优化项目结构,提升开发效率。
988 0
|
消息中间件 安全 Dubbo
java 的Remote 的使用
在Java中,"Remote" 的概念通常与Java RMI(Remote Method Invocation,远程方法调用)技术相关,它允许一个Java虚拟机(JVM)上的对象调用另一个JVM上对象的方法,就像调用本地对象一样。但是,值得注意的是,从Java 9开始,RMI已经被标记为不推荐使用(deprecated),并且在新版本的Java中可能不再得到支持和更新。尽管如此,了解RMI的基本概念仍然对理解分布式Java应用程序的设计和开发有所帮助。 ### RMI的基本步骤 1. **定义远程接口**: 远程接口是扩展了 `java.rmi.Remote` 接口的Java接口。它
647 13
|
XML JSON 前端开发
bpmn.js 使用常见问题(不定时持续更新)
bpmn.js 使用常见问题(不定时持续更新)
6555 2
|
Java 开发工具
开发工具系列 之 同一个电脑上安装多个版本的JDK
这篇文章介绍了如何在一台电脑上安装和配置多个版本的JDK,包括从官网下载所需JDK、安装过程、配置环境变量以及如何查看和切换当前使用的JDK版本,并提到了如果IDEA和JDK版本不兼容时的解决方法。
开发工具系列 之 同一个电脑上安装多个版本的JDK
|
存储 Java 数据库
如何在Spring Boot中实现多租户数据隔离
如何在Spring Boot中实现多租户数据隔离
成功解决:java: 无效的目标发行版: 17
这篇文章讲述了如何解决在启动SpringBoot项目时遇到的"无效的目标发行版: 17"的问题,主要是通过修改IDEA内置的编译设置,确保它使用正确的JDK版本。
|
Java Spring
解决SpringBoot中@RequestBody不能和Multipart同时传递的问题
请根据你的实际需求选择上述方法之一来解决Spring Boot中 `@RequestBody`不能和 `Multipart`同时使用的问题。
1850 1
|
Java 数据库 Spring
Java spring boot 实现批量删除功能
Java spring boot 实现批量删除功能