user2332505
user2332505

Reputation: 649

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

Upvotes: 2

Views: 13532

Answers (1)

Lets Code
Lets Code

Reputation: 773

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.

Upvotes: 5

Related Questions