WebService以前使用都是传递简单的字符串之类的参数,后面有项目需传递复杂对象类型参数,于是研究学习了下。
使用jar包:axis-1.4.jar
接口类型代码片段:
//暂挂一个有效账号的服务
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;
}
使用 deploy.wsdd 生成service-config.wsdd:(deploy.wsdd 放于WEB-INF下)
我自己弄个批处理(复制到一个txt文件,保存为.bat文件即可运行):
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>
要注意那2个arrayMapping的设置。
服务发布成功后,访问你的服务,把显示的网页保存为.wsdl文件。
根据这个文件,就可以生成相应的代码。
这个功能我也弄了个批处理:
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
执行上面的批处理,会在设置的Output_Path文件夹下面生成相关的代码,以及deploy.wsdd,undeploy.wsdd文件,根据这些文件,就可以调用前面发布的服务了。
调用测试:
1、客户端调用。
这个就不搞了,有了客户端代码就很简单了。
2、Call方式调用,这个要说下。
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} );
}
}
上述都是代码片段,仅供参考。
分享到:
相关推荐
在 Axis1.4 中传递复杂类型数组参数,涉及到的是 Web 服务中的数据绑定和消息处理。Axis 是一个开源的 SOAP 库,它允许开发者创建、部署和使用 Web 服务。在处理复杂类型数组时,ArrayMapping 是 Axis 中的一个关键...
axis1_4 发布webservice 传递对象或返回对象(一)_benet6_新浪博客.mht
对于复杂对象,客户端需要创建相应的对象实例,填充数据后,作为参数传递给服务端。 6. **测试与调试**: Axis提供了wsdl2java工具生成的测试客户端,可以用来验证Web服务的正确性。此外,还可以使用像SoapUI这样...
Axis支持传递复杂对象和内部类作为参数或返回值。在服务端,需要确保这些类具有正确的序列化和反序列化实现,以便在客户端和服务器之间正确地传输数据。 **五、Handler和Chain特性** Handler是Axis中的一个关键...
你需要实例化 Stub 类,然后调用对应的方法,并传递参数。 ### 5. 测试与调试 在部署服务和生成客户端代码后,可以通过简单的测试来验证 WebService 是否工作正常。你可以使用 Axis 提供的测试工具或者自定义的...
本实战案例将关注使用Axis2进行复杂对象传输以及文件传输,特别是如何通过Web服务来传递列表(List)、对象(Object)和文件。 首先,让我们深入理解`axis2 Demo`。Axis2 提供了一个强大的开发和部署环境,它支持多种...
在Java世界中,当我们需要通过WebService传递复杂的数据结构时,例如一个对象或javabean,AXIS提供了很好的支持。javabean是一种Java类,遵循特定的命名和设计规则,用于封装数据和提供访问这些数据的方法,它们常...
4. **调用服务方法**:通过存根对象调用Web服务的方法,传递参数。 5. **处理响应**:接收服务返回的数据并进行后续处理。 总的来说,这个压缩包提供了一套关键的库,使得开发者能够利用Apache Axis2 1.5.4版本轻松...
在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...
1. **理解SOAP**:SOAP是一种基于XML的消息传递协议,用于在Web上交换结构化和类型化的信息。它是Web服务的基础,Axis通过SOAP实现了客户端和服务端的通信。 2. **WSDL(Web Service Description Language)**:...
传递复杂对象和内部类 Axis 支持传递 Java 对象,包括内部类,作为 WebService 方法的参数或返回值。对象会被序列化为 XML 格式进行网络传输。 ### 7. Handler 和 Chain 特性 Axis 中的 Handler 机制允许自定义...
AXIS2在处理POJO时会自动进行对象的序列化和反序列化,如果这个过程出现问题,就会导致对象未能正确初始化。 解决这个问题的关键在于确保客户端和服务端使用相同的数据类型和序列化机制。检查服务类的setter方法...
本文将详细介绍如何使用Apache Axis库来实现这一功能,以及处理.NET WebService返回的对象,特别是Dataset类型。 首先,为了在Java中调用.NET WebService,我们需要以下依赖库: 1. axis.jar - Apache Axis的核心...
【描述】: "本教程详细介绍了如何使用axis2在eclipse和tomcat环境下构建webService服务,并阐述了如何让Android应用程序调用这些服务,包括传递自定义类型参数和集合。" 【标签】: "webService", "axis2" 【正文】...
- **概念**: 在 Axis2 中可以通过简单的 POJO 类直接发布 WebService,无需复杂的配置文件。 - **示例**: - **POJO 类**: `SimpleService` ```java public class SimpleService { public String getGreeting...
如果我们想传递 Date 类型参数给 Axis2 创建的 WebService 方法,那么需要先将 Date 类型转换为 String 类型再传递。例如,我们可以将”2012-12-28 7:21:33”传给 WebService 方法。 10. 使用 invokeRobust 调用...
- 示例4:可能使用了复杂类型或数组作为参数,展示了如何序列化和反序列化这些数据。 5. **详细注释**: 代码中的注释对于理解每个步骤至关重要。它们会解释代码的目的,如何工作,以及可能出现的问题。例如,...
总之,Java Webservice Axis2 Client的开发涉及到生成客户端代码、设置SOAP Header、调用服务和处理响应等多个步骤。了解这些概念和API对于构建安全、可靠的Web服务客户端至关重要。在实际项目中,确保遵循最佳实践...