Search code examples
springspring-ws

Spring-WS : How to extract Soap Message Body


I am trying to extract soap body from a soap request in a spring-ws application. My soap request is

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org  /soap/envelope/" xmlns:sch="http://www.manager.cts.com/schema">
 <soapenv:Header/>
   <soapenv:Body>
     <sch:addManagerRequest>
         <sch:name>shivani</sch:name>
         <sch:salary>1231231</sch:salary>
         <sch:developer>
            <sch:firstName>asd</sch:firstName>
            <sch:lastName>asdasd</sch:lastName>
            <sch:salary>123123</sch:salary>
         </sch:developer>
     </sch:addManagerRequest>
  </soapenv:Body>
</soapenv:Envelope>

I tried to extract soap body using the following code :

@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
    SoapMessage message = (SoapMessage) messageContext.getRequest();
    SoapBody soapBody = message.getSoapBody();

    Source bodySource = soapBody.getSource();
    DOMSource bodyDomSource = (DOMSource) bodySource;

    Node bodyNode = bodyDomSource.getNode();
    System.out.println(bodyNode.getNodeValue());
    System.out.println(bodyNode.getChildNodes());
 }

Output is :

 null
 [soapenv:Body: null]

Please help me solve this problem. I am new to spring-ws


Solution

  • The best solution is to use Jaxb unmarshal() method. Your java mapping files files should have proper annotations :- Example :

     @XmlRootElement(name = "name_of_request")
     public class Request {
    
       @XmlElement(required = true) // add this annotation for each field value
       protected String test; 
       //other fields + getter and setter
    

    Once you have mapped files correctly use jaxb to unmarshal object for you :-

        SoapMessage message = (SoapMessage) messageContext.getRequest();
        SoapBody soapBody = message.getSoapBody();
        Source bodySource = soapBody.getPayloadSource();
        DOMSource bodyDomSource = (DOMSource) bodySource;
    
        JAXBContext context = JAXBContext.newInstance(Request.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
    
        Request request = (Request) unmarshaller.unmarshal(bodyDomSource);
        // populate request object.