Camel和CXF:如何获取出站消息?

时间:2017-04-12 19:19:40

标签: soap apache-camel cxf

我有这条骆驼路线:

    from("cxf:bean:endpointDocs01?loggingFeatureEnabled=true")
    .to("direct:CBR") 
    .transform().method(WebServiceUtils.class,"response()")
    .log("Outbound message: ${body}");

endpointDocs01 在蓝图中定义如下:

<cxf:cxfEndpoint address="/documentos/" id="endpointDocs01"
    serviceClass="com.adelco.webservice.ServiceDocs" wsdlURL="wsdl/wsdl03.wsdl">
    <cxf:properties>
        <entry key="schema-validation-enabled" value="true"/>
    </cxf:properties>
</cxf:cxfEndpoint>

这条路线没有任何问题,包括架构验证。

当我发送正确的请求时,我可以使用交换的最后一行“ .log(”出站消息:$ {body} “来执行”事情“(在本例中为日志记录)。在这种情况下,日志显示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <outputDocumento xmlns="http://webservice.adelco.com">
         <respuesta>0</respuesta>
         <mensaje>El mensaje [113282] fue recibido. Fecha recepción Wed Apr 12 17:01:11 CLT 2017</mensaje>
       </outputDocumento>
    </soap:Body>
</soap:Envelope>

但是,当我发送一个不正确的请求时,“。log(”Log outbound message:$ {body}“这一行什么也没做。但是我在客户端得到一个响应(一个Soap:Fault响应)

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
          <faultcode>soap:Client</faultcode>
          <faultstring>Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'Sociedad'. One of '{"http://webservice.adelco.com":TipoMovimiento}' is expected.</faultstring>
       </soap:Fault>
    </soap:Body>
 </soap:Envelope>

为什么这个肥皂:没有记录故障响应?

2 个答案:

答案 0 :(得分:3)

解组之后调用您的路线。因此,如果因无效输入而导致解组失败,则路由不会触发,也不会记录。

阅读有关CXF architecture的文章。

  

相位拦截器
  CXF提供了一个名为PhaseInterceptorChain的InterceptorChain实现。 [...]
  让我们采用一个假设的简化示例(注意:这些阶段和拦截器不一定存在于CXF中)。我们假设我们正在解析SOAP消息。我们可能想要分两个阶段。首先,调度阶段解析soap标头并确定将消息路由到哪个服务。第二,将SOAP主体绑定到JAXB对象的unmarshal阶段   故障处理
  在处理过程中的任何时候,拦截器都可能抛出一个故障,或者像SoapFault那样抛出一个故障的衍生物。这将导致链停止调用和展开它。展开包括在每个以相反顺序调用的拦截器上调用handleFault。

当发生故障时,处理停止并且拦截链展开。 CXF对消息(输入和输出)和故障(输入和输出)使用不同的链。

使用自定义bean(必须实现PhaseInterceptor接口)作为拦截器:

<cxf:cxfEndpoint address="/documentos/" id="endpointDocs01"
    serviceClass="com.adelco.webservice.ServiceDocs" wsdlURL="wsdl/wsdl03.wsdl">
    <cxf:properties>
        <entry key="schema-validation-enabled" value="true"/>
    </cxf:properties>
    <cxf:inInterceptors>
        <ref component-id="inInterceptorBean" />
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref component-id="outInterceptorBean" />
    </cxf:outInterceptors>
    <cxf:outFaultInterceptors>
        <ref component-id="outFaultInterceptorBean" />
    </cxf:outFaultInterceptors>
</cxf:cxfEndpoint>

答案 1 :(得分:0)

就像@Allesandro所说的那样,链条会在失败时解开。

您可以添加一个onException子句:

onException(ValidationException.class)
  .log("Outbound message: ${body}");

from("cxf:bean:endpointDocs01?loggingFeatureEnabled=true")
.to("direct:CBR") 
.transform().method(WebServiceUtils.class,"response()")
.log("Outbound message: ${body}");