Java - How to show Soap Fault

15,400

Solution 1

if you want to print fault content as a xml string , you must convert the dom instance returned by the fa.getDetail() to String , fa.getDetail().toString() return ["+getNodeName()+": "+getNodeValue()+"]" not the content of the xml.

try the following;

String detailStr=dom2string(fa.getDetail())
System.err.println("FaultCode: " + fa.getFaultCode() + " - Detail: " + detailStr); 


public static final String dom2string(Node node) {
    try {
        if (node == null) {
            return null;
        }

        Transformer tf = transformerThreadLocal.get();
        // Create writer
        StringWriter sw = new StringWriter(buffer, Integer.MAX_VALUE);
        StreamResult result = new StreamResult(sw);

        // transform
        tf.transform(new DOMSource(node), result);

        return sw.getBuffer();
    } catch (Exception e) {
        throw new RuntimeException("Could not convert Node to string", e);
    }
}

Solution 2

This is the way that I always handle soap fault errors:

StringWriter sw = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(
new DOMSource(soapFaultException.getFault()), new StreamResult(sw));
String xml = sw.toString();
Share:
15,400
cadaov
Author by

cadaov

I currently develop in Powerbuilder, also Sybase SQL Anywhere. Trying to learn Java and c# on my way to upgrading technologies.

Updated on June 04, 2022

Comments

  • cadaov
    cadaov almost 2 years

    I have this kind of response when having a Soap Fault calling a Java Web Service

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <soap:Fault>
                <faultcode>soap:Server</faultcode>
                <faultstring>Fault occurred while processing.</faultstring>
                <detail>
                    <ns1:WaybillRegistrationFault xmlns:ns1="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                        <errors xmlns:ns2="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                            <code>80000</code>
                            <description>El número de CTG 20140904 ya existe</description>
                        </errors>
                        <errors xmlns:ns2="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                            <code>1000</code>
                            <description>La carta de porte ya se encuentra registrada.</description>
                        </errors>
                    </ns1:WaybillRegistrationFault>
                </detail>
            </soap:Fault>
        </soap:Body>
    </soap:Envelope>
    

    I did an Soap Handler with its handleFault method like this: public boolean handleFault(SOAPMessageContext context) {

        try {
            System.err.println("Handler handleFault");
    
            if (context.getMessage().getSOAPBody().hasFault()) {
                SOAPFault fa = context.getMessage().getSOAPBody().getFault();
                System.err.println(fa.getFaultString());
                System.err.println("FaultCode: " + fa.getFaultCode() + " - Detail: " + fa.getDetail());
            }
            return true;
        } catch (SOAPException ex) {
            System.err.println("SoapEx " + ex.getMessage());
            return true;
        }
    }
    

    But in my output all I have is :

    Handler handleFault
    Fault occurred while processing.
    FaultCode: soap:Server - Detail: [detail: null]
    

    How do I process the errors node?

    Update:

    with fa.getDetail().getFirstChild().getTextContent() I get the text within the xml. How do I get that as an object. It be a WaybillRegistrationFault I think.