搜索

3.13. Apache CXF 集成

download PDF

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 构造器 参数:

表 3.5. AutomaticWorkQueueImpl Constructor Properties
属性默认值

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.incxf.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 InterceptorsApache 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()和 setter()方法 的有效 be an。通过检查类定义,值对象将转换为正确的原语类型。也可以配置嵌套的 Bean。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.