axis-WebService传递复杂对象类型参数

[size=medium]WebService以前使用都是传递简单的字符串之类的参数,后面有项目需传递复杂对象类型参数,于是研究学习了下。[/size]

[size=medium]使用jar包:axis-1.4.jar[/size]

接口类型代码片段:

//暂挂一个有效账号的服务
public AccountResponse suspendAccount(AccountRequest accountInfo);
//检查一个有效账号的密码是否正确的服务
public AccountResponse validatePassword(AccountRequest accountInfo);
测试与Web Service的通讯是否正常的服务
public AccountResponse testConnection(AccountRequest accountInfo);
//修改一个有效账号可修改属性的服务
public AccountResponse modifyAccount(AccountRequest accountInfo);
//恢复一个已暂挂账号的服务
public AccountResponse restoreAccount(AccountRequest accountInfo);
//查询并返回全部或符合查询条件的账号集合的服务
public SearchAccountsResponse searchAccounts(AccountRequest accountInfo);
//创建一个新账号的服务
public AccountResponse addAccount(AccountRequest accountInfo);
//删除一个账号的服务
public AccountResponse deleteAccount(AccountRequest accountInfo);
//修改一个有效账号密码的服务
public AccountResponse changePassword(AccountRequest accountInfo);


AccountRequest对象片段:

public class AccountRequest implements Serializable{
/**
* 请求唯一标识 字符串,每次请求唯一
*/
private String requestID;

/**
* 账号信息对象 用户数据对象
*/
private AccountInfo accountInfo;
}


AccountResponse对象片段:

public class AccountResponse implements Serializable{
/**
* 请求唯一标识 字符串,每次响应唯一,与请求时的ID保持一致
*/
private String requestID;

/**
* 处理结果标识 true:处理成功 false:处理失败
*/
private Boolean returnFlag;

/**
* 返回结果编号 由应用自行定义;
当returnFlag为true时,returnCode为0;
当returnFlag为false时,returnCode为错误编码
*/
private String returnCode;

/**
* 返回结果信息 由应用自行定义,可放入提示、警告或错误信息描述
*/
private String returnMessage;
}


SearchAccountsResponse对象片段:

public class SearchAccountsResponse {

private AccountInfo[] accountInfoList;

private Integer accountInfoSize;

private String requestID;

private String returnCode;

private Boolean returnFlag;

private String returnMessage;
}


AccountInfo对象片段:

public class AccountInfo implements Serializable{
/**
* 用户应用账号 应用账号ID
*/
private String accountID;

/**
* 人员中文姓名
*/
private String cn;

/**
* 应用登录密码
*/
private String userPassword;
/**
* 兼职部门ID
*/
private String[] workOrg;

/**
* 兼职部门名称
*/
private String[] workOrgName;
}


[size=medium]使用 deploy.wsdd 生成service-config.wsdd:([color=red]deploy.wsdd 放于WEB-INF下[/color])
我自己弄个批处理(复制到一个txt文件,保存为.bat文件即可运行):[/size]

D:

cd D:\workspaceEclipse\AxisTest\WebContent\WEB-INF

java org.apache.axis.client.AdminClient -lhttp://127.0.0.1:8080/AxisTest/services/AdminService deploy.wsdd

@echo 已经成功生成,代码在D:\workspaceEclipse\AxisTest\WebContent\WEB-INF目录下

@echo -----------------------------------------

@pause


deploy.wsdd:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="exoaUmService" provider="java:RPC" style="wrapped" use="literal">
<parameter name="wsdlTargetNamespace" value="http://cn.com"/>
<parameter name="wsdlServiceElement" value="exUmService"/>
<parameter name="schemaQualified" value="http://cn.com"/>
<parameter name="wsdlServicePort" value="exUmServiceHttpPort"/>
<parameter name="className" value="com.axis.test.ExUmService"/>
<parameter name="wsdlPortType" value="exUmServicePortType"/>
<parameter name="typeMappingVersion" value="1.2"/>
<operation name="suspendAccount" qname="operNS:suspendAccount" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="validatePassword" qname="operNS:validatePassword" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="testConnection" qname="operNS:testConnection" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="modifyAccount" qname="operNS:modifyAccount" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="restoreAccount" qname="operNS:restoreAccount" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="searchAccounts" qname="operNS:searchAccounts" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:SearchAccountsResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="addAccount" qname="operNS:addAccount" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="deleteAccount" qname="operNS:deleteAccount" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<operation name="changePassword" qname="operNS:changePassword" xmlns:operNS="http://cn.com" returnQName="retNS:out" xmlns:retNS="http://cn.com" returnType="rtns:AccountResponse" xmlns:rtns="http://cn.com" soapAction="" >
<parameter qname="pns:accountInfo" xmlns:pns="http://cn.com" type="tns:AccountRequest" xmlns:tns="http://cn.com"/>
</operation>
<parameter name="allowedMethods" value="*"/>

<typeMapping
xmlns:ns="http://cn.com"
qname="ns:SearchAccountsResponse"
type="java:com.axis.test.SearchAccountsResponse"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=""
/>
<typeMapping
xmlns:ns="http://cn.com"
qname="ns:AccountInfo"
type="java:com.axis.test.AccountInfo"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=""
/>
<arrayMapping
xmlns:ns="http://cn.com"
qname="ns:ArrayOfAccountInfo"
type="java:com.axis.test.AccountInfo[]"
innerType="cmp-ns:AccountInfo" xmlns:cmp-ns="http://cn.com"
encodingStyle=""
/>
<typeMapping
xmlns:ns="http://cn.com"
qname="ns:AccountResponse"
type="java:com.axis.test.AccountResponse"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=""
/>
<typeMapping
xmlns:ns="http://cn.com"
qname="ns:AccountRequest"
type="java:com.axis.test.AccountRequest"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=""
/>
<arrayMapping
xmlns:ns="http://cn.com"
qname="ns:ArrayOfString"
type="java:java.lang.String[]"
innerType="cmp-ns:string" xmlns:cmp-ns="http://www.w3.org/2001/XMLSchema"
encodingStyle=""
/>
</service>
</deployment>


[size=medium][color=red]要注意那2个arrayMapping的设置。[/color][/size]

[size=medium]服务发布成功后,访问你的服务,把显示的网页保存为.wsdl文件。
根据这个文件,就可以生成相应的代码。
这个功能我也弄了个批处理:[/size]


set Axis_Lib=F:\axis\axis-1_4\lib

set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%

set Output_Path=F:\axis\service

set Package=com.test.webservice

%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o %Output_Path% -p %Package% -s F:\axis\exUmService.wsdl

@echo 客户端代码已经成功生成,代码在F:\axis\service目录下

@echo -----------------------------------------

@pause


[size=medium]执行上面的批处理,会在设置的Output_Path文件夹下面生成相关的代码,以及deploy.wsdd,undeploy.wsdd文件,根据这些文件,就可以调用前面发布的服务了。
[/size]

[size=medium]调用测试:

1、客户端调用。
这个就不搞了,有了客户端代码就很简单了。

2、Call方式调用,这个要说下。[/size]

public void test(String methodName,AccountRequest accountInfo){

Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(targetEendPoint));

QName qn = new QName("http://cn.com", "AccountInfo" );

call.registerTypeMapping(AccountInfo.class,qn,
new BeanSerializerFactory(AccountInfo.class, qn),
new BeanDeserializerFactory(AccountInfo.class, qn));

QName qn2 = new QName("http://cn.com", "AccountResponse" );

call.registerTypeMapping(AccountResponse.class,qn2,
new BeanSerializerFactory(AccountResponse.class, qn2),
new BeanDeserializerFactory(AccountResponse.class, qn2));

QName qn3 = new QName("http://cn.com", "AccountRequest" );

call.registerTypeMapping(AccountRequest.class,qn3,
new BeanSerializerFactory(AccountRequest.class, qn3),
new BeanDeserializerFactory(AccountRequest.class, qn3));

QName qn4 = new QName("http://cn.com", "SearchAccountsResponse" );

call.registerTypeMapping(SearchAccountsResponse.class,qn4,
new BeanSerializerFactory(SearchAccountsResponse.class, qn4),
new BeanDeserializerFactory(SearchAccountsResponse.class, qn4));

QName qn5 = new QName("http://cn.com", "ArrayOfAccountInfo" );

call.registerTypeMapping(AccountInfo[].class,qn5,
new ArraySerializerFactory(qn, null),
new ArrayDeserializerFactory());//留意此处

call.setOperationName(new QName("http://cn.com",methodName));

call.addParameter( "arg1", qn3, ParameterMode.IN );

if("searchAccounts".equals(methodName)){

call.setReturnClass(SearchAccountsResponse.class);

SearchAccountsResponse result = (SearchAccountsResponse) call.invoke( new Object[] {accountInfo} );

AccountInfo[] att=result.getAccountInfoList();

}else{
call.setReturnClass(AccountResponse.class);

AccountResponse result = (AccountResponse) call.invoke( new Object[] {accountInfo} );

}
}


[size=medium]上述都是代码片段,仅供参考。[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值