11.Axis客户端接收不同参数类型
转自:http://www.guance.com/708.html
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 {
all = (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));
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();
}
11.Axis客户端接收不同参数类型的更多相关文章
- python函数参数类型及其顺序
根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
背景: 最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言: ...
- 接收的参数为日期类型、controller控制层进行数据保存、进行重定向跳转
目录 1.接收的参数为日期类型 2.controller控制层进行数据保存 3.controller层如何进行重定向跳转(因为默认是请求转发) 4.静态资源的映射 1.接收的参数为日期类型 WEB-I ...
- MVC如何避免控制器方法接收到的值不能被转换为参数类型
假设控制器方法参数类型是int: public ActionResult GetSth(int id) { return Content(id.ToString()); } 而视图传递过来的是字符串: ...
- 11、mybatis的映射xml中参数类型的别名
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型.需要resultType指定输出结果的映射类型. 如果在指定类型时输入类型全 ...
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...
- [Perl] Getopt 函数来接收用户参数的使用
我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
- tomcat与jetty接收请求参数的区别
[场景] 服务端点对点通知.A服务发起请求B服务,B同步返回接收成功:然后B开始处理逻辑:B处理完成后异步通知给A:A接收请求并处理,同步回写响应给B:完成. [先上代码] 服务端(接收端)代码: i ...
随机推荐
- java9新特性-22-总结
1.在java 9 中看不到什么? 1.1 一个标准化和轻量级的JSON API 一个标准化和轻量级的JSON API被许多java开发人员所青睐.但是由于资金问题无法在Java 9中见到,但并不会削 ...
- PostgreSQL Replication之第九章 与pgpool一起工作(5)
9.5 检查复制 如果所有的节点都处于开机并运行的状态.我们就可以在集群上运行我们的第一个操作了.在我们的例子中,我们将简单地连接到pgpool并创建一个新的数据库.createdb 是一个命令行工具 ...
- 6、json支持
package main import ( "encoding/json" "fmt") // Json 支持 type Response1 struct{ P ...
- echarts如何修改数据视图dataView中的样式
原文链接:点我 做了一个现实折线图的图表,通过右上角icon可以自由切换成柱状图,表格.在表格中遇到的一点小问题,解决方案如下: 1.场景重现 这是一个显示两个折线图的图表,一切看起来都很顺利.但是点 ...
- Unity C# 设计模式(四)抽象工厂模式
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构. 抽象工厂模式使用同一个 工厂等级结构负责这 ...
- ArcGIS api for javascript——地图配置-
描述 本例展示了如果删除缩放等级滑动器的刻度线.通过设置esriConfig里的sliderLabel为null来实现: esriConfig.defaults.map.sliderLabel = n ...
- ArcGIS api for javascript——以地理处理结果为条件查询地图
这里发生什么任务呢?当第一次单击地图,单击的坐标被发送到一个Geoprocessor任务.该任务访问服务器上的通过ArcGIS Server 地理处理服务提供的可用的GIS模型.本例中模型计算驱动时间 ...
- 移动App架构设计
移动App架构设计 本文主要总结了几种经常使用的架构模式, 基本是层层递进的转载请注名出处 http://blog.csdn.net/uxyheaven, 良好的排版在https://github.c ...
- ztree中依据后台中传过来的node的id,将这个node的复选框置为不可用
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");//树对象 var node = treeObj.getNodeByParam(& ...
- 7-07. PAT排名汇总(25) (结构体 ZJU_PAT)
题目链接:http://www.patest.cn/contests/ds/7-07 编程能力測试(Programming Ability Test,简称PAT)是浙江大学计算机科学与技术学院主办的专 ...