Java - How to show Soap Fault
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();
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, 2022Comments
-
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.