Apache Axis 是早期主流的 Java Web Service 引擎,基于 SOAP 1.1/1.2、WSDL 1.1。雖已停止維護(建議新項目用 CXF 或 Spring Boot + JAX-WS),但大量存量系統仍在運行,掌握其部署調試能力對維護至關重要。
axis-1.4-bin.zip,解壓獲取 webapps/axis 目錄。axis 目錄複製到 Tomcat webapps/ 下,啟動 Tomcat 自動部署。https://localhost:8080/axis/ 出現 "Axis happiness page" 即成功。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; }
}
放置於 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>
.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>
編寫 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。
@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 等。
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 service | server-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 僅用於存量系統維護。