18.4. 端点选项


CXF 端点使用 URI 语法进行配置:

cxf:beanId:address

使用以下路径和查询参数:

18.4.1. 路径参数(2 参数)

Name描述默认值类型

beanId (common)

查找现有配置的 CxfEndpoint。必须使用 bean: 作为前缀。

 

字符串

地址 (服务)

服务发布地址。

 

字符串

18.4.2. 查询参数(35 参数)

Name描述默认值类型

dataformat (common)

CXF 端点支持的数据类型消息。

Enum 值:

  • PAYLOAD
  • RAW
  • 消息
  • CXF_MESSAGE
  • POJO

POJO

dataformat

wrappedStyle (common)

描述 SOAP 正文中如何表示参数的 WSDL 风格。如果值为 false,则 CXF 将选择 Documentation-literal unwrapped 风格,如果值为 true,则 CXF 将选择文档粘贴风格。

 

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer (advanced))

要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。

 

ExceptionHandler

exchangePattern (consumer (advanced))

在消费者创建交换时设置交换模式。

Enum 值:

  • InOnly
  • InOut
  • InOptionalOut
 

ExchangePattern

cookieHandler (producer)

配置 Cookie 处理程序来维护 HTTP 会话。

 

CookieHandler

defaultOperationName (producer)

此选项将设置默认 operationName,它将由调用远程服务的 CxfProducer 使用。

 

字符串

defaultOperationNamespace (producer)

此选项将设置默认 operationNamespace,它将由调用远程服务的 CxfProducer 使用。

 

字符串

HostnameVerifier (producer)

要使用的主机名验证器。使用 sVirt 表示法引用 registry 中的 HostnameVerifier。

 

HostnameVerifier

lazyStartProducer (producer)

生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。

false

布尔值

sslContextParameters (producer)

Camel SSL 设置参考。使用 DNAT 表示法引用 SSL 上下文。

 

SSLContextParameters

wrap (producer)

CXF 端点制作者将调用的操作类型。

false

布尔值

Sync (producer (advanced))

设置是否应严格使用同步处理。

false

布尔值

allowStreaming (advanced)

这个选项控制在 PAYLOAD 模式下运行 CXF 组件是否会将传入的消息解析为 DOM Elements,或将有效负载保留为 javax.xml.transform.Source 对象,在某些情况下允许流。

 

布尔值

总线 (advanced)

使用自定义配置的 CXF 总线。

 

总线

continuationTimeout (advanced)

这个选项用于设置 CXF continuation 超时,当 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可在 CxfConsumer 中使用。

30000

long

cxfBinding (advanced)

使用自定义 CxfBinding 来控制 Camel Message 和 CXF 消息之间的绑定。

 

CxfBinding

cxfConfigurer (advanced)

这个选项可以应用 org.apache.camel.component.cxf.CxfEndpointConfigurer 的实现,它们支持以编程方式配置 CXF 端点。用户可以通过实施 CxfEndpointConfigurer 的 configure{ServerClient} 方法来配置 CXF 服务器和客户端。

 

CxfConfigurer

defaultBus (advanced)

当 CXF 端点自行创建总线时,将设置默认总线。

false

布尔值

HeaderFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。

 

HeaderFilterStrategy

mergeProtocolHeaders (advanced)

是否合并协议标头。如果启用,则 Camel 和 CXF 之间的标头会变得更加一致且类似。如需了解更多详细信息,请参阅 CAMEL-6393。

false

布尔值

mtomEnabled (advanced)

启用 MTOM (attachment)。这需要使用 POJO 或 PAYLOAD 数据格式模式。

false

布尔值

properties (advanced)

使用映射中的键/值对来设置额外的 CXF 选项。例如,要在 SOAP 错误中打开 stacktraces, properties.faultStack TraceEnabled=true。

 

Map

skipPayloadMessagePartCheck (advanced)

设置是否应禁用 SOAP 消息验证。

false

布尔值

loggingFeatureEnabled (logging)

这个选项启用 CXF Logging 功能,将入站和出站 SOAP 消息写入日志。

false

布尔值

loggingSizeLimit (logging)

要限制在启用日志记录功能时日志记录器输出的字节数,-1 代表没有限制。

49152

int

skipFaultLogging (logging)

这个选项控制 PhaseInterceptorChain 是否跳过它捕获的 Fault。

false

布尔值

密码 (安全)

此选项用于为 CXF 客户端设置密码的基本身份验证信息。

 

字符串

用户名 (安全)

此选项用于为 CXF 客户端设置用户名的基本身份验证信息。

 

字符串

bindingId (service)

要使用的服务模型的 bindingId。

 

字符串

portName (service)

此服务的端点名称,它映射到 wsdl:portname。以 ns:PORT_NAME 格式,其中 ns 是在这个范围内有效的命名空间前缀。

 

字符串

publishedEndpointUrl (service)

此选项可覆盖从 WSDL 发布的 endpointUrl,可通过服务地址 url 和 wsd 访问。

 

字符串

serviceClass (service)

SEI (Service Endpoint Interface)类的类名称,该类可以具有 JSR181 注解或不。

 

serviceName (service)

此服务正在实现的服务名称,它映射到 wsdl:servicename。

 

字符串

wsdlURL (service)

WSDL 的位置。可以位于 classpath、文件系统或远程托管。

 

字符串

serviceNameportNameQNames,因此如果您提供它们带有其 {namespace} 前缀,如上例所示。

18.4.3. 数据格式的描述

在 Apache Camel 中,Camel CXF 组件是将路由与 Web 服务集成的关键。您可以使用 Camel CXF 组件创建一个 CXF 端点,该端点可使用以下方法之一使用:

  • consumer - (在路由开始时)代表 Web 服务实例,与路由集成。注入路由的有效负载类型取决于端点的 dataFormat 选项的值。
  • producer - (路由中的其他点)代表 WS 客户端代理,它将当前的交换对象转换为远程 Web 服务上的操作调用。当前交换的格式必须与端点的 dataFormat 设置匹配。
dataformat描述

POJO

POJO (旧 Java 对象)是目标服务器上调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。

PAYLOAD

PAYLOAD 是应用 CXF 端点中消息配置后的消息有效负载( soap:body的内容)。仅支持 Protocol JAX-WS 处理程序。不支持逻辑 JAX-WS 处理程序。

RAW

RAW 模式提供从传输层接收的原始消息流。如果您使用这类 DataFormat,则无法触动或更改流,因此您无法在 camel-cxf 消费者后看到任何 soap 标头。不支持 JAX-WS 处理程序。

CXF_MESSAGE

CXF_MESSAGE 允许通过将消息从传输层转换为原始 SOAP 消息来调用 CXF 拦截器的完整功能

您可以通过检索交换属性 CamelCXFDataFormat 来确定交换的数据格式模式。Exchange key 常量在 org.apache.camel.component.cxf.common.message.CxfConstants.DATA_FORMAT_PROPERTY 中定义。

18.4.4. 如何在 RAW 模式中启用 CXF 的 LoggingOutInterceptor

CXF 的 LoggingOutInterceptor 输出在有线到日志记录系统(Java Util Logging)上的出站消息。由于 LoggingOutInterceptor 处于 PRE_STREAM 阶段(但 PRE_STREAM 阶段以 RAW 模式删除),所以您必须将 LoggingOutInterceptor 配置为在 WRITE 阶段运行。以下是以下示例。

@Bean
public CxfEndpoint serviceEndpoint(LoggingOutInterceptor loggingOutInterceptor) {
    CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
    cxfEndpoint.setAddress("http://localhost:" + port
                            + "/services" + SERVICE_ADDRESS);
    cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("dataFormat", "RAW");
    cxfEndpoint.setProperties(properties);
    cxfEndpoint.getOutInterceptors().add(loggingOutInterceptor);
    return cxfEndpoint;
}


@Bean
public LoggingOutInterceptor loggingOutInterceptor() {
    LoggingOutInterceptor logger = new LoggingOutInterceptor("write");
    return logger;
}

18.4.5. relayHeaders 选项的描述

有来自一个 JAXWS WSDL-first 开发者的 in-bandout-of-band on-the-wire 标头。

in-band 标头是明确定义为端点的 WSDL 绑定合同(如 SOAP 标头)的标头。

带外 标头是通过线序列化的标头,但不明确是 WSDL 绑定合同的一部分。

标头中继/过滤是双向的。

当路由具有 CXF 端点并且开发人员需要具有在线标头(如 SOAP 标头)时,会在由另一个 JAXWS 端点使用的路由间进行转发,然后将 relayHeaders 设置为 true,这是默认值。

18.4.6. 仅适用于 POJO 模式

relayHeaders=true 表示转发标头的意图。对给定标头是否转发的实际决定将委派给实施 MessageHeadersRelay 接口的可插拔实例。将参考 MessageHeadersRelay 的共识实施,以确定是否需要转发标头。已实施 SoapMessageHeadersRelay,它将自身绑定到已知的 SOAP 名字空间。目前,只过滤带外标头,并在 relayHeaders=true 时始终转发带外标头。如果线上有一个标头,其名称空间对于运行时未知,则使用回退 DefaultMessageHeadersRelay,它只允许转发所有标头。

relayHeaders=false 设置指定所有标头带外和带外设置都应丢弃。

您可以插入您自己的 MessageHeadersRelay 实现,或向中继列表添加额外的 MessageHeadersRelay。要覆盖预加载的中继实例,请确保您的 MessageHeadersRelay 实现服务与您希望覆盖的名称相同。另请注意,覆盖中继必须服务所有要覆盖的名称空间,否则路由启动时的运行时异常将被抛出,因为这会给转发实例映射引入名字空间中的不确定性。

<cxf:cxfEndpoint ...>
   <cxf:properties>
     <entry key="org.apache.camel.cxf.message.headers.relays">
       <list>
         <ref bean="customHeadersRelay"/>
       </list>
     </entry>
   </cxf:properties>
 </cxf:cxfEndpoint>
 <bean id="customHeadersRelay" class="org.apache.camel.component.cxf.soap.headers.CustomHeadersRelay"/>

查看显示您可以在此处转发/排序标头的测试:

https://github.com/apache/camel/blob/main/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest.java

  • 支持 POJOPAYLOAD 模式。在 POJO 模式中,只有带外消息标头才可以进行过滤,因为 cxf 从标头列表中移除。in-band 标头合并到 POJO 模式的 MessageContentList 中。camel-cxf 组件会使任何尝试从 MessageContentList 中删除 in-band 标头。如果需要过滤带头标头,请在 CXF 端点中使用 PAYLOAD 模式或插入(pretty 拦截器) CXF 拦截器/DemoWS Handler。
  • Message Header Relay 机制已合并到 CxfHeaderFilterStrategy 中。relayHeaders 选项、其语义和默认值保持不变,但它是 CxfHeaderFilterStrategy 的属性。以下是配置它的示例。
@Bean
public HeaderFilterStrategy dropAllMessageHeadersStrategy() {
    CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
    headerFilterStrategy.setRelayHeaders(false);
    return headerFilterStrategy;
}

然后,您的端点可以引用 CxfHeaderFilterStrategy

@Bean
public CxfEndpoint routerNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
    CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
    cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
    cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
    cxfEndpoint.setWsdlURL("soap_header.wsdl");
    cxfEndpoint.setEndpointNameAsQName(
        QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
    cxfEndpoint.setServiceNameAsQName(SERVICENAME);
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("dataFormat", "PAYLOAD");
    cxfEndpoint.setProperties(properties);
    cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
    return cxfEndpoint;
}

@Bean
public CxfEndpoint serviceNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
    CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
    cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
    cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
    cxfEndpoint.setWsdlURL("soap_header.wsdl");
    cxfEndpoint.setEndpointNameAsQName(
        QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
    cxfEndpoint.setServiceNameAsQName(SERVICENAME);
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("dataFormat", "PAYLOAD");
    cxfEndpoint.setProperties(properties);
    cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
    return cxfEndpoint;
}

然后,按如下所示配置路由:

rom("cxf:bean:routerNoRelayEndpoint")
    .to("cxf:bean:serviceNoRelayEndpoint");
  • MessageHeadersRelay 接口稍有变化,并被重命名为 MessageHeaderFilter。它是 CxfHeaderFilterStrategy 的属性。以下是配置用户定义的消息标头过滤器的示例:
@Bean
public HeaderFilterStrategy customMessageFilterStrategy() {
    CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
    List<MessageHeaderFilter> headerFilterList = new ArrayList<MessageHeaderFilter>();
    headerFilterList.add(new SoapMessageHeaderFilter());
    headerFilterList.add(new CustomHeaderFilter());
    headerFilterStrategy.setMessageHeaderFilters(headerFilterList);
    return headerFilterStrategy;
}
  • 除了 relayHeaders 外,还可以在 CxfHeaderFilterStrategy 中配置以下属性。
Name必填描述

relayHeaders

所有消息标头都将由 Message Header Filters Type:boolean Default:true处理

relayAllMessageHeaders

所有消息标头都将传播(不由 Message Header Filters 处理) 类型:booleanDefault:false

allowFilterNamespaceClash

如果激活命名空间中的两个过滤器重叠,则属性控制如何处理它。如果值为 true,则最后一个 wins。如果值为 false,它将抛出一个 exception Type:boolean Default:false

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.