Web services 使用拦截器进行Apache CXF端点验证 我想做的是:

Web services 使用拦截器进行Apache CXF端点验证 我想做的是:,web-services,cxf,apache-camel,interceptor,Web Services,Cxf,Apache Camel,Interceptor,在CXF端点中通过架构验证实现从a到a 已在CXF终结点中启用验证: CXF拦截器: 问题: 如果我发送了一条有效的SOAP消息,那么它就可以正常工作。如果我发送了一个无效的SOAP消息,handleFault方法就会生效,记录错误,仅此而已。 对于无效SOAP消息场景,我是否可以使用handleFault方法记录故障,并且仍然将无效消息路由到JMS队列? 这是我添加到端点的唯一拦截器 我正在使用: Apache ServiceMix 5.0.0 ApacheCamel 2.12.3 Apach

在CXF端点中通过架构验证实现从a到a

已在CXF终结点中启用验证:

CXF拦截器:

问题: 如果我发送了一条有效的SOAP消息,那么它就可以正常工作。如果我发送了一个无效的SOAP消息,handleFault方法就会生效,记录错误,仅此而已。 对于无效SOAP消息场景,我是否可以使用handleFault方法记录故障,并且仍然将无效消息路由到JMS队列? 这是我添加到端点的唯一拦截器

我正在使用: Apache ServiceMix 5.0.0 ApacheCamel 2.12.3 Apache CXF 2.7.10
无法执行try/catch语句,因为错误发生在from子句中

但是,您可以使用


我已经添加了errorHandler,但没有任何更改,我仍然在Karaf中得到由以下原因引起的错误:org.xml.sax.saxpasseeption:cvc datatype valid.1.2.1:“go”不是“integer”的有效值。并且没有消息路由到无效队列。
/* Set endpoint properties */
Map<String, Object> propertiesMap = new HashMap<String, Object>();
propertiesMap.put("schema-validation-enabled", "true");

/* Create endpoint */
CxfEndpoint cxfEndpoint = new CxfEndpoint();
cxfEndpoint.setWsdlURL("wsdl/input.wsdl");
cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
cxfEndpoint.setProperties(propertiesMap);
cxfEndpoint.getInInterceptors().add(new FaultInterceptor());
from(cxfEndpoint)
.routeId("INPUT_ROUTE")
.to("jms:foo.bar");
public class FaultInterceptor extends AbstractSoapInterceptor {

  private static final Logger LOGGER = Logger.getLogger(FaultInterceptor.class);

  public FaultInterceptor() {
    super(Phase.UNMARSHAL);
  }

  public void handleMessage(SoapMessage message) throws Fault {
    LOGGER.info("handleMessage=" + message.getExchange().getInMessage());    
  }

  @Override
  public void handleFault(SoapMessage message) {
    Fault fault = (Fault) message.getContent(Exception.class);
    LOGGER.info("handleFault='" + fault + "'");   
    /* Add some header property that says the message is invalid */  
  }

}
errorHandler(deadLetterChannel("jms:foo.bar.invalid"));

from(cxfEndpoint)
 .routeId("INPUT_ROUTE")
 .to("jms:foo.bar");