Spring WS 示例已升級以支援 Spring Boot 3.0!

工程 | Greg L. Turnquist | 2022年12月2日 | ...

隨著最近Spring Boot 3.0 GA 的釋出,你們中的一些人可能對升級基於 Spring Web Services 的應用程式以充分利用此功能感興趣。Spring WS 團隊已升級我們的示例應用程式集,以幫助您完成此操作。

主分支現在跟蹤包含所有這些更新的示例版本。(構建於 Spring Boot 2.7 的先前示例版本現在位於該儲存庫的 1.0.x 分支上。)

下面介紹了一些亮點。

我們的很多工具都遷移了!

回到過去,我們的許多 XML 處理工具都在 JDK 內部。但自從 Java 9 和 Java EE 包遷移到 Eclipse Foundation 以來,這些工具已從 JDK 中移除。此外,嚴重依賴於當前 Jakarta EE 規範的基於 SOAP 的庫也進行了一些升級。

這意味著您需要升級您的外掛或改用其他外掛。例如,一些 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 流量

我們擁有的最重要的工具之一是日誌記錄。記錄進出的 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

Axiom 不支援 Jakarta EE 9+

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 不支援 Jakarta EE 9+

XWS-Security 多年來一直是一個主力。它是一個非常可靠的庫,允許我們透過規範中涵蓋的多種安全方式對 SOAP 訊息進行簽名、保護、加密、解密和驗證。使用 XWS-Security,無論是在客戶端還是伺服器端,都可以非常輕鬆地精確設定您所需的功能。

問題是,XWS-Security 自 2008 年以來就沒有更新過。這意味著,它不支援基於 Jakarta EE 9 的 API。

值得慶幸的是,我們有 Apache WSS4J 專案,該專案今年 10 月釋出了一個支援 Jakarta EE 9 的版本。

這些示例已升級,展示瞭如何在基於客戶端和基於伺服器的訊息傳遞中使用 Spring WS 的 Wss4jSecurityInterceptor。

總體上更多的 Spring Boot

您可能沒有意識到,這些示例是多年前,早在 2013 年由 Spring WS 的原始建立者 Arjen Poutsma 建立的。它們早於很多東西,包括 Spring Boot。它們最初是在不使用 Spring Data 的情況下編寫的,並且它們也以 Spring 的傳統 XML 格式開始,同時使用 Spring WS 2.1。

我一直致力於升級這些示例,以使用更現代的基於 Java 的配置約定,儘可能切換到 Spring Boot 自動配置的服務,並在有意義的地方遷移到完全使用 Spring Data JPA。我將繼續根據需要升級這些示例,以更好地利用它們。

如果您發現問題或可能的改進,請隨時提交拉取請求。歡迎貢獻!

總結

我知道用 Java 配置基於 SOAP 的服務可能會非常脆弱。示例是我們軟體開發人員最需要的東西之一。

但希望透過更新這些示例以與 Spring Boot 3.0、Jakarta EE 9+、Java 17 和 Spring Framework 6.0 配合使用,如果您需要幫助組裝下一個(或當前!)基於 SOAP 的應用程式,您將有一個很好的起點。

--Greg Spring Web Services 專案負責人

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有