Search code examples
javasoapjax-ws

Getting Raw XML From SOAPMessage in Java


I've set up a SOAP WebServiceProvider in JAX-WS, but I'm having trouble figuring out how to get the raw XML from a SOAPMessage (or any Node) object. Here's a sample of the code I've got right now, and where I'm trying to grab the XML:

@WebServiceProvider(wsdlLocation="SoapService.wsdl")
@ServiceMode(value=Service.Mode.MESSAGE)
public class SoapProvider implements Provider<SOAPMessage>
{
    public SOAPMessage invoke(SOAPMessage msg)
    {
        // How do I get the raw XML here?
    }
}

Is there a simple way to get the XML of the original request? If there's a way to get the raw XML by setting up a different type of Provider (such as Source), I'd be willing to do that, too.


Solution

  • 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?)