最近又開始研究使用AXIS提供WebService的方法了,按照教程基本實現了Java提供的WebService客戶端的調用,而且本WebService的調用參數以及回顯參數都爲自定義對象angelDosRequest以及angelDosResponse。
服務端配置代碼 一個服務接口類ITT_PeTraceWebSvc,一個接口實現類PeTraceWebSvcImp
重點在於deploy.wsdd配置:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- Services from TestAxisService WSDL service -->
<service name="TTL_PETraceAirportData" provider="java:RPC" style="wrapped" use="literal"> <!-- 服務名稱,自己定義 -->
<parameter name="wsdlTargetNamespace" value="http://petrace.com"/> <!-- 將顯示在wsdl上的命名空間 ,自己定義-->
<parameter name="wsdlServiceElement" value="TTL_PETraceAirportData"/> <!-- 將顯示在wsdl中wsdl:service節點的 name屬性, 自己定義-->
<parameter name="schemaQualified" value="http://petrace.com"/> <!-- 自己定義-->
<parameter name="wsdlServicePort" value="PeTraceBiz"/> <!-- 將顯示在wsdl中wsdl:port節點的 name屬性, 自己定義 -->
<parameter name="className" value="com.travelsky.pe.webservice.impl.TTL_PeTraceWebSvcImpl"/> <!-- 實現類名,要帶上包名 -->
<parameter name="wsdlPortType" value="ITTL_PeTraceWebSvc"/> <!-- 接口名 -->
<parameter name="typeMappingVersion" value="1.2"/>
<!-- 下面就是對方法的描述了,要寫對方法的名字,返回值類型和參數的名字和類型 -->
<operation name="AirportDataBiz" qname="operNS:AirportDataBiz" xmlns:operNS="http://petrace.com" returnQName="retNS:angelDosResponse" xmlns:retNS="http://petrace.com" returnType="retNS:angelDosResponse" xmlns:rtns="http://www.w3.org/2001/XMLSchema" soapAction="" >
<parameter qname="pns:angelDosRequest" xmlns:pns="http://petrace.com" type="pns:angelDosRequest" xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
</operation>
<parameter name="allowedMethods" value="AirportDataBiz"/> <!-- value裏面用空格隔開方法名 -->
<!-- 串行化的關鍵就在下面這裏了,對自定義類型wsResult的描述。。。注意type屬性裏要帶上包名 -->
<typeMapping xmlns:ns="http://petrace.com" qname="ns:angelDosRequest" type="java:com.travelsky.pe.util.AngelDosRequest" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" />
<typeMapping xmlns:ns="http://petrace.com" qname="ns:angelDosResponse" type="java:com.travelsky.pe.util.AngelDosResponse" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" />
</service>
</deployment>
使用如下命令生成server-config.wsdd:
set Axis_Lib=E:/axis-1_4/lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://localhost:8080/pe-speservice/services/AdminService
%Java_Cmd% org.apache.axis.client.AdminClient -l %Axis_Servlet% E:/opt/deploy.wsdd
客戶端測試代碼,自己手寫的(要把AXIS中除了axis-ant.jar的包都加上):
public static void main(String[] args) {
String targetEndPoint="http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData";
Service service = new Service();
try {
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(targetEndPoint);
call.setOperation("AirportDataBiz" );
AngelDosRequest request=new AngelDosRequest();
request.setMessageFunction("APT_PUT");
AngelDosResponse response=new AngelDosResponse();
try {
QName qn_request = new QName("http://petrace.com","angelDosRequest");
call.registerTypeMapping(AngelDosRequest.class,qn_request,
new BeanSerializerFactory(AngelDosRequest.class, qn_request),
new BeanDeserializerFactory(AngelDosRequest.class, qn_request));
QName qn_response = new QName("http://petrace.com","angelDosResponse");
call.registerTypeMapping(AngelDosResponse.class,qn_response,
new BeanSerializerFactory(AngelDosResponse.class, qn_response),
new BeanDeserializerFactory(AngelDosResponse.class, qn_response));
call.setReturnClass(AngelDosResponse.class);
call.setTargetEndpointAddress(targetEndPoint);
call.setOperation("AirportDataBiz");
response = (AngelDosResponse)call.invoke(new Object[]{request});
System.out.println("result="+response.getResultMsg());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ServiceException e) {
e.printStackTrace();
}
}
到這裏即可宣告WebService的發佈和調用了。
然而,爲了實現客戶端程序的自動發佈,看到了一種方式,即在發佈目錄的web-inf目錄下執行如下代碼,
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData?wsdl
可生成相應的客戶端代碼,
但是在調用時 總提示錯誤爲
java.io.IOException: Type {http://www.w3.org/2001/XMLSchema}angelDosResponse is
referenced but not defined.
at org.apache.axis.wsdl.symbolTable.SymbolTable.checkForUndefined(Symbol
Table.java:665)
at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:545
)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:518)
at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:495)
at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:361)
at java.lang.Thread.run(Thread.java:619)
摸不着頭腦,搜了網上相應的信息,發現問題還是出在deploy.wldd,其中紅色標記處,開始都寫成了rtns、或是tns,其實這種錯誤在瀏覽wsdl中可以發現,如下圖:
wdsl中xsd的命名空間是xmlns:xsd="http://www.w3.org/2001/XMLSchema",當然報錯了。於是將xsd改成當前wsdl的targetNamespace就ok了!!!
正確wsdl如下圖:
再次運行java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/pe-speservice/services/TTL_PETraceAirportData?wsdl
一切正常,當前目錄下生成如下文件: