Daddy Pumpkin
Daddy Pumpkin

Reputation: 484

Apache CXF Endpoint validation with Interceptor

What I want to do:

Implement a Camel route from a CXF Endpoint to an JMS queue with schema validation in CXF endpoint.

Validation is enabled in CXF endpoint:

/* 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());

The Camel route:

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

The CXF interceptor:

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 */  
  }

}

Problem:

The works ok if I send a valid SOAP message. If I send an invalid SOAP message, the handleFault method kicks in, logs the fault and that's all. For the invalid SOAP message scenario, is it possible that I can log the fault with handleFault method and still route the invalid message to the JMS queue? This is the only interceptor I've added to the endpoint.

I'm using:

Upvotes: 0

Views: 1475

Answers (1)

Petter Nordlander
Petter Nordlander

Reputation: 22279

You can't do a try/catch statement since the error happends in the "from" clause.

However, you can use a Dead Letter Channel.

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

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

Upvotes: 0

Related Questions