我有这条骆驼路线:
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>
为什么这个肥皂:没有记录故障响应?
答案 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}");