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 值:
| 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 值:
| 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、文件系统或远程托管。 | 字符串 |
serviceName
和 portName
是 QNames,因此如果您提供它们带有其 {namespace} 前缀,如上例所示。
18.4.3. 数据格式的描述
在 Apache Camel 中,Camel CXF 组件是将路由与 Web 服务集成的关键。您可以使用 Camel CXF 组件创建一个 CXF 端点,该端点可使用以下方法之一使用:
- consumer - (在路由开始时)代表 Web 服务实例,与路由集成。注入路由的有效负载类型取决于端点的 dataFormat 选项的值。
- producer - (路由中的其他点)代表 WS 客户端代理,它将当前的交换对象转换为远程 Web 服务上的操作调用。当前交换的格式必须与端点的 dataFormat 设置匹配。
dataformat | 描述 |
---|---|
| POJO (旧 Java 对象)是目标服务器上调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。 |
|
|
|
|
|
|
您可以通过检索交换属性 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-band 和 out-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"/>
查看显示您可以在此处转发/排序标头的测试:
-
支持
POJO
和PAYLOAD
模式。在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 | 必填 | 描述 |
---|---|---|
| 否 |
所有消息标头都将由 Message Header Filters Type: |
| 否 |
所有消息标头都将传播(不由 Message Header Filters 处理) 类型: |
| 否 |
如果激活命名空间中的两个过滤器重叠,则属性控制如何处理它。如果值为 |