Creating SOAP Faults in Apache ServiceMix

WSDL

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.fernandoribeiro.eti.br/sample/servicemix" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.fernandoribeiro.eti.br/sample/servicemix" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <xs:schema elementFormDefault="qualified" targetNamespace="http://www.fernandoribeiro.eti.br/sample/servicemix" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            ...
      <xs:element name="SampleFault"> <!-- great opportunity for a common type -->
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Message" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </wsdl:types>
  ...
  <wsdl:message name="SampleFault">
    <wsdl:part name="SampleFault" element="tns:SampleFault" />
  </wsdl:message>
  <wsdl:portType name="SamplePortType">
    <wsdl:operation name="SampleOperation">
      ...
      <wsdl:fault name="SampleFault" message="tns:SampleFault" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="SampleSoapBinding" type="tns:SamplePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    ...
    <wsdl:operation name="SampleOperation">
      <soap:operation ... />
      ...
      <wsdl:fault name="SampleFault">
        <soap:fault name="SampleFault" use="literal" />
      </wsdl:fault>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="SampleService">
    <wsdl:port name="SamplePort" binding="tns:SampleSoapBinding">
      <soap:address location="http://localhost/servicemixsample/SampleService/" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

RouteBuilder

package br.eti.fernandoribeiro.sample.servicemix;

import org.apache.camel.builder.RouteBuilder;

public final class SampleRouteBuilder extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    onException(Exception.class).process(new SampleFaultProcessor());
  }

}

Processor

package br.eti.fernandoribeiro.ws.sample.servicemix;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public final class SampleFaultProcessor implements Processor {
  private static final DocumentBuilderFactory FACTORY = DocumentBuilderFactory.newInstance();

  private DocumentBuilder builder;

  public SampleFaultProcessor() throws ParserConfigurationException {
    builder = FACTORY.newDocumentBuilder();
  }

  public void process(final Exchange exch) throws ParserConfigurationException {
    final Document doc = builder.newDocument();

    final Element root = doc.createElementNS("http://www.fernandoribeiro.eti.br/sample/servicemix", "SampleFault");

    final Element msg = doc.createElementNS("http://www.fernandoribeiro.eti.br/sample/servicemix", "Message");

    msg.setTextContent(exch.getException().getMessage());

    root.appendChild(msg);

    doc.appendChild(root);

    exch.getFault().setBody(doc);
  }

}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s