Spring WS 示例已升级支持 Spring Boot 3.0!

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

随着最近宣布 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 流量

我们拥有的最重要的工具之一是日志记录。记录传入和传出的 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 项目,该项目在今年十月发布了一个支持 Jakarta EE 9 的版本。

示例已升级,展示了如何在基于客户端和基于服务器的消息传递中使用 Spring WS 的 Wss4jSecurityInterceptor。

更多 Spring Boot 整体内容

您可能没有意识到,这些示例是很久以前,早在 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 项目负责人

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您飞速发展。

了解更多

获得支持

Tanzu Spring 在一项简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部