axis2 WebService的釋出與呼叫及部分異常
webservice實現也是Http請求,只是傳輸的內容是soap協議的xml檔案。只要是認清了這個就發現可以用多種方式去呼叫介面,如JS、URLConnection(可參考:https://www.cnblogs.com/yolanda-lee/p/4907380.html)、XFire、wsimport生成原生代碼、axis2生成客戶端程式碼等多種方法,只是網上的博文一般都三種呼叫方式。
由於我手頭上的專案用的是axis2,後面就以axis2的方法來舉例,axis2釋出服務端有兩種方法。一,直接將axis2.war放到tomcat中,在將自己寫的介面打包成aar檔案放進去釋出服務。二,將axis2整合到現有的專案中,這種方式才是最常用的。
釋出服務端
生成客戶端及呼叫
基本的有三種方式:
常用axis2生成客戶端的方式:
由於我當前手頭有一個 axis2_1.5.1的,就以此舉例:
下載
解壓,取lib目錄中的jar新增到工程中
** 此處為了偷懶就將全部的包引入到工程中,當然也可以用maven新增依賴或Axis2 1.5 客戶端需要的最小jar包集合。有時候為了在前方快速的搭一個測試環境只能以這種原始的方法。
工程中引入
生成客戶端
cmd執行命令
D:\axis2-1.5.1\bin\WSDL2Java -uri http://ip:port/oa/service/zteFlowFileService?wsdl -p com .zte.eas.client.oaWorkflow -o oa
引數解釋:
-p 引數指定了生成的Java類的包名,
-o 引數指定了生成的一系列檔案儲存的根目錄
在執行完上面的命令後,在當前目錄下多了個oa目錄,其中ZteWorkflowFileServiceStub.java 是客戶端程式,ZteWorkflowFileServiceCallbackHandler.java 是非同步客戶端程式。
將生成的三個jar檔案複製到專案中
編寫呼叫的測試程式碼
package com.zte.eas.client.oaWorkflow;
import java.rmi .RemoteException;
import com.zte.eas.client.oaWorkflow.ZteWorkflowFileServiceStub.SaveFlowFile;
import com.zte.eas.client.oaWorkflow.ZteWorkflowFileServiceStub.SaveFlowFileResponse;
public class TestService {
protected static String srvUrl = "http://ip:port/oa/service/zteFlowFileService"; // 服務地址
public static void main(String[] args) throws RemoteException,
BusinessExceptionException {
ZteWorkflowFileServiceStub zteWorkflowFileServiceStub =
new ZteWorkflowFileServiceStub(
srvUrl);
SaveFlowFile saveFlowFile = new SaveFlowFile();
saveFlowFile.setIn0("10000");
saveFlowFile.setIn1("GDC10000");
saveFlowFile.setIn2("111");
saveFlowFile.setIn3("1000");
saveFlowFile.setIn4("GDC10000");
saveFlowFile.setIn5("10000");
saveFlowFile.setIn6("DSLFI");
saveFlowFile.setIn7("1000");
SaveFlowFileResponse saveFlowFileResponse =
zteWorkflowFileServiceStub.saveFlowFile(saveFlowFile);
System.out.println("**********************************");
String sendResult = saveFlowFileResponse.localOut; // 返回1 成功 2 失敗 3
// 已經存在代辦
System.out.println("**********************************sendResult:" + sendResult);
}
}
客戶端執行,成功返回結果
客戶端異常處理
org.apache.axis2.AxisFault: Index: 5, Size: 5 異常
這面這個介面生產環境上使用了多時,後來一直呼叫不成功。介面地址能正常訪問,但我們的客戶端一直呼叫失敗,服務端系統推卸責任,一口咬定是我們客戶端的問題。
到處查詢資料一直找不到原因,後面實在沒有辦法就在前方搭一個環境呼叫一下。
發現也是出現同樣的錯誤。
重新生成客戶端,發現In5,In6,In7這三個屬性報錯,SaveFlowFile類沒有這三個屬性。註釋掉,再次呼叫,發現成功了。
服務端改動過,但沒有告知我們呼叫方。問題懟回去。
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement result at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
客戶端有點問題,程式碼:
while (!reader.isStartElement() && !reader.isEndElement()) reader.next();
if (reader.isStartElement() && new javax.xml.namespace.QName("http://192.168.2.19:8443/cbsp-rb/services/NSTCService.ws","result").equals(reader.getName())){
// if (reader.isStartElement() && new javax.xml.namespace.QName("","result").equals(reader.getName())){
java.lang.String content = reader.getElementText();
object.setResult(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString(content));
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was passed
throw new org.apache.axis2.databinding.ADBException("Unexpected subelement " + reader.getLocalName());
}
while (!reader.isStartElement() && !reader.isEndElement())
reader.next();
if (reader.isStartElement())
// A start element we are not expecting indicates a trailing invalid property
throw new org.apache.axis2.databinding.ADBException("Unexpected subelement " + reader.getLocalName());
在第二行程式碼中的reader.getName().getNamespaceURI() 一直是””
與前面new出來的不一樣。改成下面那段註釋的程式碼即可