Apache CXF 是 Apache 基金會繼 Axis2 後的另一力作,雖同源卻採截然不同設計哲學。本文介紹 CXF 使用 JAXB 2.x 數據綁定與 JAX-WS 2.x 註解配置的基礎開發流程,並與 Axis2、Metro 進行横向對比,展示跨堆棧相容性與模組化部署優勢。
| 特性 | CXF | Axis2 | Metro |
|---|---|---|---|
| 開發起點 | Java 代碼或 WSDL 雙向 | 同 | 同 |
| 服務建模 | 操作↔方法、端口類型↔介面 | 同 | 同 |
| 數據綁定選擇 | 支援 JAXB/XMLBeans/其他,WSDL 生成代碼僅限 JAXB/XMLBeans | 支援多種,但 WSDL 生成不支援 JAXB 標準 | 僅 JAXB(參考實現) |
| 配置技術(前端) | 首選 JAX-WS 2.x 註解 + XML 配置 | JAX-WS 支援有限制 | JAX-WS 參考實現,支援完整 |
| 模組化 JAR | 高度模組化,按需打包(/lib/WHICH_JARS 指引) | 單體部署模式 | 單體部署模式 |
| 部署單元 | WAR 檔(內建 Jetty 生產級 HTTP 伺服器) | 服務安裝目錄熱部署多服務 | WAR 檔 |
| WS-Security | 內建完整支援 | 需額外模組 | 內建完整支援 |
定義 4 操作:getBook、getBooksByType、getTypes、addBook。WSDL、JAXB 數據模型、服務類與 Axis2/Metro 版本幾乎相同,僅包名與服務名稱異,驗證 JAXB/JAX-WS 跨堆棧相容性。
wsimport 換為 CXF wsdl2java。-Djava.util.logging.config.file=logging.properties 抑制(僅 WARNING/SEVERE)。需建立 WAR 包含:服務實作類、JAXB 模型類、CXF 庫 JAR、兩個配置文件。
<web-app version="2.4" xmlns="https://java.sun.com/xml/ns/j2ee">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:META-INF/cxf/cxf.xml
classpath:META-INF/cxf/cxf-extension-soap.xml
classpath:META-INF/cxf/cxf-servlet.xml
</param-value>
</context-param>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:jaxws="https://cxf.apache.org/jaxws"
xsi:schemaLocation="...
https://cxf.apache.org/jaxws https://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint
id="Processor"
implementor="com.sosnoski.ws.library.cxf.CXFLibraryImpl"
wsdlLocation="WEB-INF/wsdl/library.wsdl"
address="/" />
</beans>
jaxws:endpoint 即 Spring Bean(EndpointImpl 實例),wsdlLocation 可選(未指定則運行時自動生成)。
build.xml 自動調用 wsdl2java、編譯、打包 WAR。部署後 ant run 執行客戶端驗證。CXF 全棧配置(含內部訊息流攔截器鏈)均基於 Spring IoC。cxf-servlet.xml 僅是冰山一角,核心流程配置內建於 CXF JAR 的 XML 中(參見 web.xml 的 contextConfigLocation),可透過自訂配置覆蓋或擴展。
CXF 功能遠超此簡介,後續將深入 WS-Security 實作,對比三大堆棧在安全領域的差異。JAXB/JAX-WS 標準化帶來的跨堆棧遷移自由,是技術選型的重要資產。