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