3.13. Apache CXF 集成
JBoss EAP 基础上 JBossWS 提供的所有 JAX-WS 功能目前均通过将 JBossWS 堆栈与大多数 Apache CXF 项目模块进行正确集成来提供。
Apache CXF 是一个开源服务框架。它允许使用前端编程 API(包括 JAX-WS)来构建和开发服务,服务通过 HTTP 和 JMS 等各种传输来表达各种协议,如 SOAP 和 XML/HTTP。
JBossWS 和 Apache CXF 之间的集成层主要用于:
- 允许在 JBoss EAP 上使用标准 Web 服务 API,包括 JAX-WS;这是在内部利用 Apache CXF 执行,无需用户处理;
- 允许在 JBoss EAP 上使用 Apache CXF 高级功能(包括 WS-*),而无需用户处理、设置或关注在此类容器中运行所需的集成步骤。
为了支持这些目标,JBossWS 与 Apache CXF 集成支持 JBossWS 端点部署机制,并在 Apache CXF 基础上提供多种内部定制功能。
有关 Apache CXF 架构的更深入详情,请参阅 Apache CXF 官方文档。
3.13.1. 服务器端集成自定义
JBossWS 服务器与 Apache CXF 的端集成可为提供的 Web 服务部署在内部创建正确的 Apache CXF 结构。如果部署包含多个端点,则它们将存在于同一 Apache CXF 总线中,这与其他部署的总线实例分开。
虽然 JBossWS 为服务器端的大多数 Apache CXF 配置选项设置了明智的默认值,但用户可能希望微调为其部署创建的总线实例; jboss-webservices.xml
描述符可用于部署级别自定义。
3.13.1.1. Deployment Descriptor Properties
jboss-webservices.xml
描述符可用于提供属性值。
<webservices xmlns="http://www.jboss.com/xml/ns/javaee" version="1.2"> ... <property> <name>...</name> <value>...</value> </property> ... </webservices>
JBossWS 与 Apache CXF 集成附带一组允许的属性名称,以控制 Apache CXF 内部。
3.13.1.2. WorkQueue 配置
Apache CXF 使用 WorkQueue
实例来处理一些操作,例如 @Oneway
请求处理。WorkQueueManager
安装在总线中作为扩展名,并允许添加或删除队列以及控制现有的队列。
在服务器端,可以使用 jboss-webservices.xml
中的 cxf.queue.<queue-name>.*
属性来提供队列。例如,您可以使用 cxf.queue.default.maxQueueSize
属性来配置默认 工作队列的最大队列大小。
在部署时,JBossWS 集成可将 AutomaticWorkQueueImpl
的新实例添加到当前配置的 WorkQueueManager
中。以下属性用于填写 AutomaticWorkQueueImpl
构造器 参数:
属性 | 默认值 |
---|---|
cxf.queue.<queue-name>.maxQueueSize | 256 |
cxf.queue.<queue-name>.initialThreads | 0 |
cxf.queue.<queue-name>.highWaterMark | 25 |
cxf.queue.<queue-name>.lowWaterMark | 5 |
cxf.queue.<queue-name>.dequeueTimeout | 120000 |
3.13.1.3. 策略替代选择器
Apache CXF 策略引擎支持不同的策略来处理策略替代方案。JBossWS 集成当前默认为 MaximalAlternativeSelector
,但仍允许使用 jboss-webservices.xml 文件中的
属性来设置不同的选择器实施。
cxf.policy.
alternativeSelector
3.13.1.4. MBean 管理
Apache CXF 允许您管理安装到 JBoss EAP MBean 服务器的 MBean 对象。您可以通过 jboss-webservices.xml
文件中的 cxf.management.enabled
属性,在部署基础上启用此功能。您还可以使用 cxf.management.installResponseTimeInterceptors
属性来控制 CXF 响应时间拦截器的安装。在启用 MBean 管理时,这些拦截器会被默认添加,但在某些情况下可能不需要这些拦截器。
示例: jboss-webservices.xml
文件中的 MBean 管理
<webservices xmlns="http://www.jboss.com/xml/ns/javaee" version="1.2"> <property> <name>cxf.management.enabled</name> <value>true</value> </property> <property> <name>cxf.management.installResponseTimeInterceptors</name> <value>false</value> </property> </webservices>
3.13.1.5. 架构验证
Apache CXF 包含了在客户端和服务器端验证传入和传出 SOAP 信息的功能。验证针对端点 WSDL 合同(服务器端)或用于构建服务代理(客户端一侧)中的 WSDL 合同中的相关模式进行。
您可以使用以下任一方式启用 schema 验证:
JBoss EAP 服务器配置中:
例如,以下管理 CLI 命令为默认的
Standard-Endpoint-Config
端点配置启用架构验证。/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/property=schema-validation-enabled:add(value=true)
在预定义的客户端或端点配置文件中。
您可以通过在引用的 配置文件中将
schema-validation-enabled
属性设置为true
,将容器内运行的任何端点或客户端与 JBossWS 预定义 配置关联。以编程方式在客户端一侧.
在客户端,您可以编程方式启用模式验证。例如:
((BindingProvider)proxy).getRequestContext().put("schema-validation-enabled", true);
在服务器端使用
@org.apache.cxf.annotations.SchemaValidation
注释。在服务器端,您可以使用
@org.apache.cxf.annotations.SchemaValidation
注释。例如:import javax.jws.WebService; import org.apache.cxf.annotations.SchemaValidation; @WebService(...) @SchemaValidation public class ValidatingHelloImpl implements Hello { ... }
3.13.1.6. Apache CXF Interceptors
jboss-webservices.xml
描述符可指定 cxf.interceptors.in
和 cxf.interceptors.out
属性。这些属性允许您将声明拦截器附加到为提供部署而创建的 总线
实例。
示例: jboss-webservices.xml
文件
<?xml version="1.1" encoding="UTF-8"?> <webservices xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee"> <property> <name>cxf.interceptors.in</name> <value>org.jboss.test.ws.jaxws.cxf.interceptors.BusInterceptor</value> </property> <property> <name>cxf.interceptors.out</name> <value>org.jboss.test.ws.jaxws.cxf.interceptors.BusCounterInterceptor</value> </property> </webservices>
您可以使用以下方法之一声明拦截器:
-
端点类上的注释用法,如
@org.apache.cxf.interceptor.InInterceptor 或
@org.apache.cxf.interceptor.OutInterceptor
. -
通过
org.apache.cxf.interceptor.InterceptorProvider
接口直接在客户端使用 API。 - JBossWS 描述符使用.
由于 JBoss EAP 中不再支持 Spring 集成,因此 JBossWS 集成使用 jaxws-endpoint-config.xml
描述符文件,以避免对实际客户端或端点代码进行修改。您可以在预定义的客户端和端点配置中声明拦截器,方法是为 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>
每个指定的拦截器类的新实例将添加到分配了该配置的客户端或端点。拦截器类必须具有无参数构造器。
3.13.1.7. Apache CXF 功能
jboss-webservices.xml
描述符可指定 cxf.features
属性。此属性允许您声明要附加到属于为服务部署创建的 总线
实例的任何端点。
示例: jboss-webservices.xml
文件
<?xml version="1.1" encoding="UTF-8"?> <webservices xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee"> <property> <name>cxf.features</name> <value>org.apache.cxf.feature.FastInfosetFeature</value> </property> </webservices>
您可以使用以下方法之一声明功能:
-
端点类上的注释用法,如
@org.apache.cxf.feature.Features.
-
通过
org.apache.cxf.feature.AbstractFeature
类的扩展直接在客户端使用 API。 - JBossWS 描述符使用.
由于 JBoss EAP 中不再支持 Spring 集成,因此 JBossWS 集成添加了额外的描述符,即基于 jaxws-endpoint-config.xml
文件的方法,以避免对实际客户端或端点代码进行修改。您可以通过指定 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>
每个指定功能类的新实例将添加到分配配置的客户端或端点。功能类必须具有无参数构造器。
3.13.1.8. 属性 - 生成 Bean 创建
Apache CXF Interceptors 和 Apache CXF 功能 部分解释了如何通过客户端或端点预定义配置或 jboss-webservices.xml
描述符中的属性声明 CXF 拦截器和功能。通过仅获取指定功能或拦截器类名称,容器尝试使用类默认构造器创建 bean 实例。这会对功能或拦截器配置设置限制,除非提供了 vanilla CXF 类的自定义扩展,并在最终使用超级构造器之前通过默认的构造器设置属性。
为解决此问题,JBossWS 集成在从属性构建时附带配置简单 Bean 层次结构的机制。属性可以具有 bean 引用值,它是以 ##
开头的字符串。属性引用键用于指定 bean 类名称和各个属性的值。
例如,以下属性会导致堆栈安装两个功能实例:
键 | 值 |
---|---|
cxf.features | ##foo, ##bar |
##foo | org.jboss.Foo |
##foo.par | 34 |
##bar | org.jboss.Bar |
##bar.color | Blue |
以下代码可创建相同的结果:
import org.Bar; import org.Foo; ... Foo foo = new Foo(); foo.setPar(34); Bar bar = new Bar(); bar.setColor("blue");
这种机制假定类是具有正确 getter()和
an。通过检查类定义,值对象将转换为正确的原语类型。也可以配置嵌套的 Bean。
setter()方法
的有效 be