領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多隨著最近Spring Boot 3.0 正式發佈的公告,你們有些人可能會有興趣升級您基於 Spring Web Services 的應用程式,以充分利用它。Spring WS 團隊已升級我們的範例應用程式集,以幫助您執行此操作。
主要分支現在追蹤包含所有這些更新的範例版本。(先前基於 Spring Boot 2.7 建置的範例版本現在位於該儲存庫的 1.0.x
分支上。)
以下涵蓋了一些重點。
在過去,我們的大部分 XML 處理工具都在 JDK 內部。但自從 Java 9 以及基於 Java EE 的套件遷移到 Eclipse 基金會以來,這些工具都已從 JDK 中移除。最重要的是,嚴重依賴現已成為 Jakarta EE 規範的基於 SOAP 的函式庫,也進行了一些升級。
這表示您需要升級您的外掛程式或切換到替代方案。例如,某些 SOAP 應用程式使用 Jakarta XML Binding (JAXB)。為了符合 Jakarta EE 9+,您需要 JAXB 3.0。以下顯示一種存取 xjc 的方法,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 專案,該專案在今年 10 月發佈了支援 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。我將繼續根據需要升級這些範例,以更好地利用它們。
如果您發現問題或可能的改進,請隨時提交提取請求。歡迎投稿!
我知道使用 Java 組態基於 SOAP 的服務可能非常脆弱。範例是我們作為軟體開發人員最需要的有用事物之一。
但希望透過更新這些範例以適用於 Spring Boot 3.0、Jakarta EE 9+、Java 17 和 Spring Framework 6.0,如果您需要協助組裝下一個(或當前!)基於 SOAP 的應用程式,您將有一個很好的去處。
--Spring Web Services 專案負責人 Greg