Getting Raw XML From SOAPMessage in Java
If you have a SOAPMessage
or SOAPMessageContext
, you can use a Transformer
, by converting it to a Source
via DOMSource
:
final SOAPMessage message = messageContext.getMessage(); final StringWriter sw = new StringWriter(); try { TransformerFactory.newInstance().newTransformer().transform( new DOMSource(message.getSOAPPart()), new StreamResult(sw)); } catch (TransformerException e) { throw new RuntimeException(e); } // Now you have the XML as a String: System.out.println(sw.toString());
This will take the encoding into account, so your "special characters" won't get mangled.
It turns out that one can get the raw XML by using Provider<Source>, in this way:
import java.io.ByteArrayOutputStream;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stream.StreamResult;import javax.xml.ws.Provider;import javax.xml.ws.Service;import javax.xml.ws.ServiceMode;import javax.xml.ws.WebServiceProvider;@ServiceMode(value=Service.Mode.PAYLOAD)@WebServiceProvider()public class SoapProvider implements Provider<Source>{ public Source invoke(Source msg) { StreamResult sr = new StreamResult(); ByteArrayOutputStream out = new ByteArrayOutputStream(); sr.setOutputStream(out); try { Transformer trans = TransformerFactory.newInstance().newTransformer(); trans.transform(msg, sr); // Use out to your heart's desire. } catch (TransformerException e) { e.printStackTrace(); } return msg; }}
I've ended up not needing this solution, so I haven't actually tried this code myself - it might need some tweaking to get right. But I know this is the right path to go down to get the raw XML from a web service.
(I'm not sure how to make this work if you absolutely must have a SOAPMessage object, but then again, if you're going to be handling the raw XML anyways, why would you use a higher-level object?)