第 5 章 应用程序迁移更改
5.1. Web 服务应用程序更改 复制链接链接已复制到粘贴板!
JBossWS 5 为 JBoss EAP 7 Web 服务带来新功能和性能改进,主要通过 Apache CXF、Apache WSS4J 和 Apache Santuario 组件升级。
5.1.1. JAX-RPC 支持更改 复制链接链接已复制到粘贴板!
Java EE 6 中弃用了基于 XML 的 Java API RPC(JAX-RPC),在 Java EE 7 中是可选的。JBoss EAP 7 中不再提供或支持它。使用 JAX-RPC 的应用必须迁移为使用 JAX-WS,这是当前的 Java EE 标准 Web 服务框架。
可以通过以下任一方式识别 JAX-RPC Web 服务的使用:
-
存在一个 JAX-RPC 映射文件,它是包含根元素
<java-wsdl-mapping>的 XML 文件。 存在包含
<webservice-description> 元素的webservices.xmlXML 描述符文件,其中包括<jaxrpc-mapping-file>子元素。以下是webservices.xml描述符文件的示例,该文件定义了 JAX-RPC Web 服务:<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>-
ejb-jar.xml文件的存在,该文件包含一个<service-ref>,该文件引用了 JAX-RPC 映射文件。
5.1.2. Apache CXF Spring Web 服务更改 复制链接链接已复制到粘贴板!
在之前的 JBoss EAP 版本中,您可以通过将 jbossws-cxf.xml 配置文件与端点部署存档包含 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 替换为 Context Dependency Injection(CDI)。
Apache CXF Interceptors
JBossWS 描述符提供新的配置选项,允许您声明拦截器,而无需修改客户端端点代码。相反,您可以在预定义的客户端和端点配置中声明拦截器,方法是为 cxf.interceptors. in 和 属性指定拦截器类名称列表。
cxf.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>
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>
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);
...
您还可以通过设置系统属性来控制和覆盖 Apache CXF HTTPConduit 默认值。
| 属性 | 类型 | 描述 |
|---|---|---|
| cxf.client.allowChunking | 布尔值 | 指定是否使用块发送请求。 |
| cxf.client.chunkingThreshold | 整数 | 设置从非循环模式切换到块模式的阈值。 |
| cxf.client.connectionTimeout | 长 | 设置连接超时的毫秒数。 |
| cxf.client.receiveTimeout | 长 | 设置接收超时的毫秒数。 |
| cxf.client.connection | 字符串 |
指定是否使用 |
| cxf.tls-client.disableCNCheck | 布尔值 | 指定是否禁用 CN 主机名检查。 |
5.1.3. WS-安全性变化 复制链接链接已复制到粘贴板!
-
如果您的应用包含访问
org.apache.ws.security.WSPasswordCallback类的自定义回调处理程序,请注意此类已移到 packageorg.apache.wss4j.common.ext。 -
来自
org.apache.ws.security.saml.ext软件包的大多数 SAML bean 对象已移到org.apache.wss4j.common.saml 软件包。 - 使用 RSA v1.5 密钥传输,且默认不允许使用所有相关算法。
-
之前,安全令牌服务(STS)仅在
BehalfOf 令牌上验证。现在,它还验证ActAs令牌。因此,必须在为ActAs令牌提供的UsernameToken中指定有效的用户名和密码。 -
SAML Bearer 令牌现在需要具有内部签名。
org.apache.wss4j.dom.validate.SamlAssertionValidator类现在具有setRequireBearerSignature()方法,用于启用或禁用签名验证。
5.1.4. JBoss 模块结构更改 复制链接链接已复制到粘贴板!
cxf-api 和 cxf-rt-core JAR 已合并为一个 cxf-core JAR。因此,JBoss EAP 中的 org.apache.cxf 模块现在包含 cxf-core JAR,它提供的类比上一发行版中更多。
5.1.5. 退回 Castle 要求和更改 复制链接链接已复制到粘贴板!
如果要通过 Galois/Counter Mode(GCM)使用 AES 加密在 XML/WS-Security 中进行对称加密,您需要 BouncyCastle 安全提供商。
JBoss EAP 7 随附 org.bouncycastle 模块,JBossWS 现在能够依赖其类加载器来获取和使用 BouncyCastle 安全提供程序。因此,不再需要在当前 JVM 中静态安装 BouncyCastle。对于容器外运行的应用,可以通过在类路径中添加 BouncyCastle 库,将安全提供程序提供给 JBossWS。
您可以通过在服务器或 客户端的 属性值设置为 jax noLocalBCws-endpoint-config.xml 部署描述符文件中将 org.jboss.ws.cxf.true 来 禁用此行为。
如果要使用不同于 JBoss EAP 附带的版本,您仍然可以将 BouncyCastle 静态安装到 JVM。在这种情况下,静态安装的 BouncyCastle 安全提供程序优先于类路径中存在的提供程序。要避免任何问题,您必须使用 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 服务器。 - 在客户端代码中明确设置选择策略。
5.1.7. WebServiceRef 的 JAX-WS 2.2 要求 复制链接链接已复制到粘贴板!
容器必须使用 JAX-WS 2.2 样式构造器(在构造器中包含 WebServiceFeature 类)来构建注入到 Web 服务引用中的客户端。JBoss EAP 6.4 随附 JBossWS 4,隐藏了这一要求。JBoss EAP 7 随附 JBossWS 5,不再隐藏此要求。这意味着,容器注入的服务类必须通过更新现有代码来实施 JAX-WS 2.2 或更高版本,以使用包含一个或多个 Web 构造器。
ServiceFeature 参数的 javax.xml.ws.Service
protected Service(URL wsdlDocumentLocation,
QName serviceName,
WebServiceFeature... features)
5.1.8. IgnoreHttpsHost CN Check Change 复制链接链接已复制到粘贴板!
在以前的版本中,您可以通过将系统属性 org.jboss.security.ignoreHttoreHttpsHost 设置为 true 来禁用其证书中给定服务的通用名称(CN)的 HTTPS URL 主机名检查。此系统属性名称已被 cxf.tls-client.disableCNCheck 替代。
5.1.9. 服务器幻灯片配置和类加载 复制链接链接已复制到粘贴板!
由于启用了注入服务端点和服务客户端处理程序,无法再从 org.jboss.as.webservices.server.integration JBoss 模块中自动加载处理程序类。如果您的应用依赖于给定的预定义配置,您可能需要明确为您的部署定义新的模块依赖项。如需更多信息,请参阅 Migrate Explicit Module 依赖项
5.1.10. 弃用 Java Endorsed 标准覆盖机制 复制链接链接已复制到粘贴板!
Java 终止标准覆盖机制已在 JDK 1.8_40 中弃用,目的是将其删除在 JDK 9 中。这种机制允许开发人员通过将 JAR 放入 JRE 中的认证目录,为所有已部署的应用提供库。
如果您的应用使用 Apache CXF 的 JBossWS 实施,JBoss EAP 7 可确保以正确的顺序添加所需的依赖项,并且不应受到此更改的影响。如果您的应用程序直接访问 Apache CXF,您必须在应用程序部署过程中提供 JBossWS 依赖关系后的 Apache CXF 依赖关系。
5.1.11. EAR 归档中的描述符规格 复制链接链接已复制到粘贴板!
在之前的 JBoss EAP 发行版中,您可以为 META 目录中配置用于 POJO Web 服务部署和 WAR 存档中捆绑的 EJB Web 服务端点的 jboss-webservices.xml 部署文件。
-INF/ JAR 存档目录中的 EJB Web 服务部署配置 jboss-webservices.xml 部署文件,或者在 WAR 存档目录中的 WEB-INF/
在 JBoss EAP 7 中,您现在可以在 EAR 存档 的 部署描述符文件。如果在 EAR 归档和 JAR 或 WAR 存档中找到 META-INF/ 目录中配置 jboss- webservices.xmljboss-webservices.xml 文件,则 JAR 或 WAR 的 jboss-webservices.xml 文件中的配置数据将覆盖 EAR 描述符文件中对应的数据。