1. 程式人生 > >axis2 WebService的釋出與呼叫及部分異常

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新增到工程中

axis2jar包_62個

** 此處為了偷懶就將全部的包引入到工程中,當然也可以用maven新增依賴或Axis2 1.5 客戶端需要的最小jar包集合。有時候為了在前方快速的搭一個測試環境只能以這種原始的方法。

工程中引入

工程中引入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出來的不一樣。改成下面那段註釋的程式碼即可