首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Apache Axis 1.4 發布與調用 WebService 完整實戰教程

     編輯:Java 程式設計入門

Axis 1.4 部署架構概覽

Apache Axis 是早期主流的 Java Web Service 引擎,基于 SOAP 1.1/1.2、WSDL 1.1。雖已停止維護(建議新項目用 CXF 或 Spring Boot + JAX-WS),但大量存量系統仍在運行,掌握其部署調試能力對維護至關重要。

環境準備

  1. 下載 axis-1.4-bin.zip,解壓獲取 webapps/axis 目錄。
  2. 將 axis 目錄複製到 Tomcat webapps/ 下,啟動 Tomcat 自動部署。
  3. 驗證:訪問 https://localhost:8080/axis/ 出現 "Axis happiness page" 即成功。

服務端開發步驟

1. 定義服務接口與實現

package org.calculateservice.service;

public interface ICalculate {
    int add(int x, int y);
    int sub(int x, int y);
}

public class CalculateImpl implements ICalculate {
    @Override public int add(int x, int y) { return x + y; }
    @Override public int sub(int x, int y) { return x - y; }
}

2. 編寫 deploy.wsdd 部署描述符

放置於 WEB-INF/deploy.wsdd,詳細定義服務名、類名、暴露方法、命名空間、操作映射等。

<deployment xmlns="https://xml.apache.org/axis/wsdd/"
    xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
  <service name="Calculate" provider="java:RPC" use="literal">
    <parameter name="className" value="org.calculateservice.service.CalculateImpl" />
    <parameter name="allowedMethods" value="add sub" />
    <parameter name="scope" value="Request" />
    <parameter name="wsdlTargetNamespace" value="https://web.webservice.CalculateService.org" />
    <parameter name="wsdlServiceElement" value="Calculate" />
    <parameter name="wsdlServicePort" value="CalculateService" />
    <parameter name="wsdlPortType" value="ICalculate" />
    <parameter name="typeMappingVersion" value="1.2" />

    <operation name="add" qname="operNS:add"
        xmlns:operNS="https://web.webservice.CalculateService.org"
        returnQName="addReturn" returnType="rtns:int" xmlns:rtns="https://www.w3.org/2001/XMLSchema"
        soapAction="">
      <parameter qname="x" type="tns:int" xmlns:tns="https://www.w3.org/2001/XMLSchema" />
      <parameter qname="y" type="tns:int" xmlns:tns="https://www.w3.org/2001/XMLSchema" />
    </operation>

    <operation name="sub" qname="operNS:sub"
        xmlns:operNS="https://web.webservice.CalculateService.org"
        returnQName="subReturn" returnType="rtns:int" xmlns:rtns="https://www.w3.org/2001/XMLSchema"
        soapAction="">
      <parameter qname="x" type="tns:int" xmlns:tns="https://www.w3.org/2001/XMLSchema" />
      <parameter qname="y" type="tns:int" xmlns:tns="https://www.w3.org/2001/XMLSchema" />
    </operation>
  </service>
</deployment>

3. 自定義 AxisServlet 兼容 .NET 客戶端

.NET 客戶端調用常不發送 SOAPAction 頭,導致 Axis 404。繼承 org.apache.axis.transport.http.AxisServlet 重寫 doPost 兼容。

package org.calculateservice.core;

public class AxisServlet extends org.apache.axis.transport.http.AxisServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 兼容無 SOAPAction 的請求
        String soapAction = req.getHeader("SOAPAction");
        if (soapAction == null || soapAction.equals("\"\"")) {
            // 可從 SOAP Body 解析或設置默認
        }
        super.doPost(req, resp);
    }
}

在 web.xml 中替換默認 Servlet:

<servlet>
  <servlet-name>AxisServlet</servlet-name>
  <servlet-class>org.calculateservice.core.AxisServlet</servlet-class>
</servlet>

4. 生成 server-config.wsdd 並發布

編寫 generate-server-config.bat:

@echo off
set AXIS_HOME=..\axis-1.4
set CP=%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\commons-logging.jar;%AXIS_HOME%\lib\commons-discovery.jar;%AXIS_HOME%\lib\wsdl4j.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;.
java -cp %CP% org.apache.axis.utils.AdminServer deploy.wsdd
pause

運行後生成 WEB-INF/server-config.wsdd,重啟 Tomcat 即發布成功。訪問 https://localhost:8080/axis/services/Calculate?wsdl 獲取 WSDL。

客戶端調用

1. 使用 WSDL2Java 生成存根代碼

@echo off
set AXIS_HOME=..\axis-1.4
set CP=%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\commons-logging.jar;%AXIS_HOME%\lib\commons-discovery.jar;%AXIS_HOME%\lib\wsdl4j.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;.
java -cp %CP% org.apache.axis.wsdl.WSDL2Java -p org.calculateservice.client -o src https://localhost:8080/axis/services/Calculate?wsdl
pause

生成 Calculate.java、CalculateService.java、CalculateServiceLocator.java、ICalculate.java 等。

2. 本地代理類調用(推薦方式)

public class TestClient {
    public static void main(String[] args) throws ServiceException, RemoteException {
        CalculateService service = new CalculateServiceLocator();
        ICalculate calc = service.getCalculateService(); // 端點地址可在 Locator 中修改
        System.out.println("1 + 2 = " + calc.add(1, 2));
        System.out.println("5 - 3 = " + calc.sub(5, 3));
    }
}

修改端點地址:((javax.xml.rpc.Stub)calc)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "https://new-host:8080/axis/services/Calculate");

項目結構參考

calculate-service/
├── client/          # WSDL2Java 生成的客戶端存根
├── core/            # 自定義 AxisServlet
├── service/         # 服務接口與實現
├── test/            # 測試用例
└── WEB-INF/
    ├── deploy.wsdd
    ├── server-config.wsdd (生成)
    └── web.xml

常見坑點與排查

現象原因解決
Client 404 / No such serviceserver-config.wsdd 未生成或服務名不匹配運行 AdminServer 部署,檢查 service name
ClassNotFound: CalculateImpl類未編譯到 WEB-INF/classes 或 jar 包缺失確保編譯輸出路徑正確,依賴包放入 WEB-INF/lib
.NET 調用失敗SOAPAction 為空,Axis 默認拒絕自定義 AxisServlet 兼容空 SOAPAction
數據類型映射錯誤wsdd 中 typeMapping 與 Java 類型不符核對 qname、returnType、parameter type 命名空間

遷移建議

新項目強烈建議使用 Apache CXF 或 Spring Boot Starter Web Services (JAX-WS),優勢:支持 JAX-WS/JSR-181 標準註解開發、Spring 深度集成、REST/JSON 友好、活躍社區維護。Axis 1.4 僅用於存量系統維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved