第 5 章 应用程序迁移更改


5.1. Web 服务应用程序更改

JBossWS 5 对 JBoss EAP 7 web 服务提供了新的特性和性能改进,主要是通过升级 Apache CXFApache WSS4JApache Santuario 组件。

5.1.1. JAX-RPC 支持更改

基于 XML 的 RPC(JAX-RPC)的 Java API 在 Java EE 6 中弃用,在 Java EE 7 中是可选的。JBoss EAP 7 中不再提供或支持它。使用 JAX-RPC 的应用必须迁移到使用 Jakarta XML Web 服务,该服务为当前的 Jakarta EE 标准 Web 服务框架。

可以使用以下任一方式识别 JAX-RPC Web 服务:

  • 存在 JAX-RPC 映射文件,它是包含 root 元素 < java-wsdl-mapping > 的 XML 文件。
  • 存在 webservices.xml XML 描述符文件,其中包含 <webservice-description> 元素,其中包含一个 <jaxrpc-mapping-file> 子元素。以下是定义 JAX-RPC Web 服务的 webservices.xml 描述符文件示例。

    <webservices xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd" version="1.1">
      <webservice-description>
        <webservice-description-name>HelloService</webservice-description-name>
        <wsdl-file>WEB-INF/wsdl/HelloService.wsdl</wsdl-file>
        <jaxrpc-mapping-file>WEB-INF/mapping.xml</jaxrpc-mapping-file>
        <port-component>
          <port-component-name>Hello</port-component-name>
          <wsdl-port>HelloPort</wsdl-port>
          <service-endpoint-interface>org.jboss.chap12.hello.Hello</service-endpoint-interface>
          <service-impl-bean>
            <servlet-link>HelloWorldServlet</servlet-link>
          </service-impl-bean>
        </port-component>
      </webservice-description>
    </webservices>
    Copy to Clipboard Toggle word wrap
  • 存在 ejb-jar.xml 文件,该文件中包含引用一个 JAX-RPC 映射文件的 <service-ref>

5.1.2. Apache CXF Spring web 服务更改

在以前的 JBoss EAP 版本中,您可以通过包含带有端点部署存档的 jbossws-cxf.xml 配置文件来自定义 JBossWS 和 Apache CXF 集成。一个用例是,为 Apache CXF 总线上的 Web 服务客户端和服务器端点配置拦截器链。此集成需要在 JBoss EAP 服务器中部署 Spring。

JBoss EAP 7 不再支持 Spring 集成。包含 jbossws-cxf.xml 描述符配置文件的任何应用程序都必须修改,以替换该文件中定义的自定义配置。虽然仍然可以直接访问 Apache CXF API,但请注意,应用程序将无法可移植。

建议的方法将 Spring 自定义配置替换为新的 JBossWS 描述符配置选项。基于 JBossWS 描述符的方法提供类似功能,无需修改客户端端点代码。在某些情况下,您可以将 Spring 替换为上下文依赖注入(CDI)。

Apache CXF 拦截器

JBossWS 描述符提供了新的配置选项,允许您在不修改客户端端点代码的情况下声明拦截器。反之,您可以通过为 cxf.interceptors.incxf.interceptors.out 属性指定拦截器名称列表,在预定义的客户端和端点配置中声明拦截器。

以下是使用这些属性声明拦截器的 jaxws-endpoint-config.xml 文件的示例。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd">
  <endpoint-config>
    <config-name>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointImpl</config-name>
    <property>
      <property-name>cxf.interceptors.in</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointInterceptor,org.jboss.test.ws.jaxws.cxf.interceptors.FooInterceptor</property-value>
    </property>
    <property>
      <property-name>cxf.interceptors.out</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointCounterInterceptor</property-value>
    </property>
  </endpoint-config>
</jaxws-config>
Copy to Clipboard Toggle word wrap
Apache CXF 功能

JBossWS 描述符允许您通过为 cxf.features 属性指定功能列表,在预定义的客户端和端点配置中声明功能。

以下是使用此属性声明功能的 jaxws-endpoint-config.xml 文件的示例。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd">
  <endpoint-config>
    <config-name>Custom FI Config</config-name>
    <property>
      <property-name>cxf.features</property-name>
      <property-value>org.apache.cxf.feature.FastInfosetFeature</property-value>
    </property>
  </endpoint-config>
</jaxws-config>
Copy to Clipboard Toggle word wrap
Apache CXF HTTP 传输

在 Apache CXF 中,通过指定 org.apache.cxf.transport.http.HTTPConduit 选项来实现 HTTP 传输配置。JBossWS 集成允许以编程方式使用 Apache CXF API 修改,如下所示:

import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

// Set chunking threshold before using a JAX-WS port client
...
HTTPConduit conduit = (HTTPConduit)ClientProxy.getClient(port).getConduit();
HTTPClientPolicy client = conduit.getClient();

client.setChunkingThreshold(8192);
...
Copy to Clipboard Toggle word wrap

您还可以通过设置系统属性来控制并覆盖 Apache CXF HTTPConduit 默认值。

Expand
属性类型描述

cxf.client.allowChunking

布尔值

指定是否使用块发送请求。

cxf.client.chunkingThreshold

整数

设置从非克隆到块模式的阈值。

cxf.client.connectionTimeout

Long

设置连接超时的毫秒数。

cxf.client.receiveTimeout

Long

设置接收超时的毫秒数。

cxf.client.connection

字符串

指定是否使用 Keep-Aliveclose 连接类型。

cxf.tls-client.disableCNCheck

布尔值

指定是否禁用 CN 主机名检查。

5.1.3. WS-Security 更改

  • 如果您的应用程序包含访问 org.apache.ws.security.WSPasswordCallback 类的自定义回调处理器,请注意,此类已移到 org.apache.wss4j.common.ext 软件包。
  • org.apache.ws.saml.ext 软件包中的大多数 SAML Bean 对象已移到 org.apache.wss4j.common.saml 软件包
  • 默认情况下,不允许使用 RSA v1.5 密钥传输和所有相关算法。
  • 以前,安全令牌服务(STS)仅在 BehalfOf 令牌上进行验证。现在,它还会验证 ActAs 令牌。因此,必须在为 ActAs 令牌提供的 UsernameToken 中指定有效的用户名和密码。
  • SAML 持有者令牌现在需要具有内部签名。org.apache.wss4j.dom.SamlAsertionValidator 类现在有一个 setRequireBearerSignature() 方法,用于启用或禁用签名验证。

5.1.4. JBoss 模块结构更改

cxf-apicxf-rt-core JARs 已合并到一个 cxf-core JAR 中。因此,JBoss EAP 中的 org.apache.cxf 模块现在包含 cxf-core JAR,并公开比上一版本更多的类。

5.1.5. Bouncy Castle 要求和更改

如果要将 AES 加密与 Galois/Counter Mode(GCM)用于 XML/WS-Security 中的对称加密,则需要 BouncyCastle Security Provider。

JBoss EAP 7 附带 org.bouncastle 模块,而 JBossWS 现在能够依靠其课程加载程序来获取和使用 BouncyCastle 安全提供商。因此,在当前 JVM 中静态安装 BouncyCastle 不再需要。对于在容器外运行的应用程序,可通过在类路径中添加 BouncyCastle 库来为 JBossWS 提供安全供应商。

您可以禁用此行为:把 jaxws-endpoint-config.xml 部署描述符文件(对于服务器)或 jaxws-client-config.xml 部署描述符文件(对于客户端)中的 org.jboss.ws.cxf.noLocalBC 属性值设置为true

如果要使用与 JBoss EAP 附带的版本不同的版本,您仍可将 BouncyCastle 安装到 JVM。在这种情况下,按照类路径中的提供者选择静态安装的 BouncyCastle Security Provider。要避免任何问题,您必须使用 BouncyCastle 1.49、1.51 或更高。

5.1.6. Apache CXF 总线选择策略

在容器中运行的客户端的默认总线选择策略已从 THREAD_BUS 改为 TCCL_BUS。对于运行内存不足的客户端,默认的策略仍然是 THREAD_BUS。您可以使用以下方法之一将行为恢复到之前的版本。

  • 使用系统属性 org.jboss.ws.cxf.jaxws-client.bus.strategy 值设置为 THREAD_BUS 来启动 JBoss EAP 服务器。
  • 在客户端代码中明确设置选择策略。

容器必须使用 Jakarta XML Web 服务 2.2 风格构造器,它将 WebServiceFeature 类包含在构造器中,以构建注入 Web 服务引用的客户端。JBoss EAP 6.4 包括了 JBossWS 4,隐藏了这一要求。JBoss EAP 7 包括了 JBossWS 5,不再隐藏了这一要求。这意味着,容器注入的用户提供的服务类必须通过更新现有代码来实现 Jakarta XML Web Services 2.2 或更高版本,以使用包含一个或多个 WebServiceFeature 参数的 javax.xml.ws.Service 结构器。

protected Service(URL wsdlDocumentLocation,
       QName serviceName,
       WebServiceFeature... features)
Copy to Clipboard Toggle word wrap

5.1.8. IgnoreHttpsHost CN 检查更改

在以前的版本中,您可以通过将系统属性 org.jboss.security.ignoreHttpsHost 设置为 true 来禁用对证书中提供的服务通用名称(CN)的 HTTPS URL 主机名检查。这个系统属性名称已被 cxf.tls-client.disableCNCheck 替代。

5.1.9. 服务器端配置和类加载

由于启用注入服务端点和服务客户端处理程序,便无法再自动加载来自 org.jboss.as.webservices.server.integration JBoss 模块的处理程序类。如果您的应用程序依赖于给定的预定义的配置,您可能需要为部署显式定义新的模块依赖项。如需更多信息,请参阅迁移模块依赖项

5.1.10. 弃用 Java 签名的标准覆盖机制

JDK 1.8_40 中弃用了 Java 背书的标准覆盖机制,旨在将其从 JDK 9 中删除。这种机制使开发人员能够通过将 JARs 放入 JRE 中的最终目录,使库可供所有部署的应用程序使用。

如果您的应用程序使用 Apache CXF 的 JBossWS 实施,JBoss EAP 7 可确保以正确顺序添加所需的依赖项,您不应受到此更改的影响。如果您的应用程序直接访问 Apache CXF,则现在必须在 JBossWS 依赖项作为应用程序部署的一部分后提供 Apache CXF 依赖项。

5.1.11. EAR 归档中的描述符规格

在以前的 JBoss EAP 版本中,您可以为 Jakarta Enterprise Beans Web 服务部署描述符文件配置 jboss-webservices.xml 部署描述符文件,在 JAR 存档的 META-INF/ 目录中配置 JAR 存档或 WEB-INF/ 目录中用于 POJO Web 服务部署以及 Jakarta Enterprise Beans Web 服务端点的 Jakarta Enterprise Beans Web 服务端点。

在 JBoss EAP 7 中,您现在可以在 EAR 归档的 META-INF/ 目录中配置 jboss-webservices.xml 部署描述符文件。如果 EAR 归档和 JAR 或 WAR 存档中都找到了 jboss-webservices.xml 文件,则 JAR 或 WAR 中的 jboss-webservices.xml 文件中的配置数据会覆盖 EAR 描述符文件中对应的数据。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat