axis2 WebService的發佈與調用及部分異常

相關博文:
WebService學習整理(一)——客戶端三種調用方式整理
axis2生成服務端及客戶端

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生成客戶端的方式:
由於我當前手頭有一個 axis2_1.5.1的,就以此舉例:

下載

axis2下載地址 http://archive.apache.org/dist/ws/axis2/1_5_1/
axis2下載

解壓,取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出來的不一樣。改成下面那段註釋的代碼即可

發佈了86 篇原創文章 · 獲贊 83 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章