4

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.

2 Answers 2

5

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(); 
Sign up to request clarification or add additional context in comments.

Comments

0

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); } } 

4 Comments

Executing fa.getDetail().getFirstChild().getTextContent() I get the message but all in text format, is there a way to have it as an object?
fa.getDetail().getFirstChild() is the object you want
It's worth noticing that it's not an Java object, but an XML sort of object, which I had to parse through Node and NodeList.
I highly recommend using xmlbeans if you prefer handling xml document as objects instead of dom. Check xmlbeans.apache.org

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.