領先一步
VMware 提供培訓和認證,助您飛速發展。
瞭解更多隨著最近宣佈 Spring Boot 3.0 正式釋出 (GA),你們中的一些人可能有興趣升級基於 Spring Web Services 的應用程式以充分利用這一優勢。Spring WS 團隊已經升級了我們的示例應用程式集,以幫助您完成此操作。
主分支 (main branch) 現在跟蹤包含所有這些更新的示例版本。(基於 Spring Boot 2.7 構建的先前版本示例現在位於該倉庫的 1.0.x
分支上。)
下面涵蓋了一些重點內容。
回溯到過去,我們的很多 XML 處理工具都位於 JDK 內部。但自從 Java 9 以及基於 Java EE 的軟體包遷移到 Eclipse Foundation 以來,這些工具就已從 JDK 中移出。除此之外,SOAP 庫(嚴重依賴於現在的 Jakarta EE 規範)也進行了一些升級。
這意味著您需要升級您的外掛或切換到替代方案。例如,一些 SOAP 應用程式使用 Jakarta XML Binding (JAXB)。為了符合 Jakarta EE 9+ 規範,您需要 JAXB 3.0。下面展示了訪問 xjc(一個流行的根據 XSD 檔案生成 Java POJO 類的工具)的一種方式
示例 1. 在 XSD 檔案上使用 JAXB 的 xjc 編譯器 (airline/server/pom.xml)
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>${project.basedir}/src/main/resources/messages.xsd</sources>
<packageName>org.springframework.ws.samples.airline.schema</packageName>
<target>3.0</target>
</configuration>
</plugin>
注意
這並非旨在全面列出所有設定,而僅是一個示例,說明如何使用它。請訪問外掛的參考文件以獲取更多詳細資訊。
有幾種工具可以將 WSDL 編譯成 Java 類,其中之一是 Jakarta XML Web Services (JAX-WS)。
示例 2. 使用 JAX-WS 的 wsimport 工具編譯 WSDL (airline/client/jax-ws/pom.xml)
<plugin>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- The name of your generated source package -->
<wsdlFiles>${project.basedir}/../airline.wsdl</wsdlFiles>
<packageName>org.springframework.ws.samples.airline.client.jaxws</packageName>
<sourceDestDir>${sourcesDir}</sourceDestDir>
<destDir>${classesDir}</destDir>
<extension>true</extension>
</configuration>
</plugin>
實際上有多種方法可以做到這一點,如果您檢視每個示例,它們都略有不同。選擇最符合您需求的方法。
我們擁有的最重要的工具之一是日誌記錄。記錄傳入和傳出的 SOAP 訊息對於除錯配置以及確保我們傳送伺服器期望的內容至關重要。感謝 Spring Boot,除錯 SOAP 流量比以往任何時候都容易。
只需將其新增到您的 application.properties
檔案中
示例 3. 記錄 SOAP 訊息 (airline/server/src/main/resources/application.properties)
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE
不幸的是,Spring Web Services 4.0 不得不放棄對 Apache Axiom 的支援。其最新版本 (1.4) 仍然使用舊版本的 Java EE Activation,而不是 Jakarta EE 版本。
具有諷刺意味的是,我們的 Axis1 客戶端(Axis 是構建在 Axiom 之上的)仍然可以工作!這主要是因為該示例沒有使用 Spring WS,而是使用簡單的 Axis API 與 Airport Server 通訊。(也許我們不需要這樣的示例?)
所有這些的結果是,SOAP 本身作為一項技術非常穩定。SOAP 訊息的規範和格式並沒有真正改變。相反,幫助我們組成、傳輸和使用 SOAP 訊息的庫正在發生變化。因此,一個遺留庫可以輕鬆地與執行最新版本 Spring WS 的新改進的 SOAP 伺服器通訊。
多年來,XWS-Security 一直是我們的主力工具。它是一個堅固可靠的庫,允許我們透過規範中涵蓋的多種安全方式來簽名、保護、加密、解密和驗證 SOAP 訊息。在客戶端和伺服器上使用 XWS-Security 配置您需要的功能非常容易。
問題是,XWS-Security 自 2008 年以來一直沒有更新。這意味著,它不支援基於 Jakarta EE 9 的 API。
值得慶幸的是,我們有 Apache WSS4J 專案,該專案在今年十月釋出了一個支援 Jakarta EE 9 的版本。
示例已升級,展示瞭如何在基於客戶端和基於伺服器的訊息傳遞中使用 Spring WS 的 Wss4jSecurityInterceptor。
您可能沒有意識到,這些示例是很久以前,早在 2013 年由 Spring WS 的原創者 Arjen Poutsma 建立的。它們早於許多事物,包括 Spring Boot。它們最初編寫時沒有任何 Spring Data 的用法,並且在使用 Spring WS 2.1 的同時,以 Spring 的遺留 XML 格式開始。
我一直努力升級這些示例,使其採用更現代的基於 Java 的配置慣例,儘可能切換到 Spring Boot 自動配置的服務,並在有意義的地方遷移到全面使用 Spring Data JPA。我將繼續根據需要升級這些示例,以便更好地利用它們。
如果您發現問題或可能的改進,請隨時提交 Pull Request。歡迎貢獻!
我知道使用 Java 配置基於 SOAP 的服務可能會非常脆弱。示例是我們作為軟體開發人員最需要有用的東西之一。
但希望透過將這些示例更新以使用 Spring Boot 3.0、Jakarta EE 9+、Java 17 和 Spring Framework 6.0,如果您需要幫助構建您的下一個(或當前的!)基於 SOAP 的應用程式,您將有一個很好的參考。
--Greg Spring Web Services 專案負責人