Spring WS 示例已升级到 Spring Boot 3.0!

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

随着最近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**(一种流行的从 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 与机场服务器通信。(也许我们不需要这样的示例?)

所有这一切的结果是,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 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 的应用程序,您将有一个不错的参考。

--Greg Spring Web Services 项目负责人

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以提升您的进度。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部