Karibasappa G C
Karibasappa G C

Reputation: 2732

adding security details to soap header in spring client

I am trying to consume SOAP (external system) web service using Spring WS template as client.

I need to pass header information(security details) as header along with the soap message.

I tried adding that information into Header using java xml SOAPMessage(javax.xml.soap.SoapMessage) and trying to convert it into spring SOAPMessage(org.springframework.ws.soap.SoapMessage) later after adding header details.

but its not able to cast it, getting class cast exception as both of them are not in heirarchy.

please help me on how to pass security details on header info in spring soap message

My code is as below

   public void doWithMessage(WebServiceMessage message) throws IOException,
                                    TransformerException

    SaajSoapMessage saajSoapMessage =(SaajSoapMessage)message;      
    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    SOAPHeader soapHeader = soapEnvelope.getHeader();
    Name headerElementName = soapEnvelope.createName("Security","wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

    // Add "Security" soapHeaderElement to soapHeader
    SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerElementName);

    // This may be important for some portals!
    soapHeaderElement.setActor(null);

    // Add usernameToken to "Security" soapHeaderElement 
    SOAPElement usernameTokenSOAPElement = soapHeaderElement.addChildElement("UsernameToken");

    // Add username to usernameToken
    SOAPElement userNameSOAPElement = usernameTokenSOAPElement.addChildElement("Username");
    userNameSOAPElement.addTextNode("myUserName");          
    // Add password to usernameToken
    SOAPElement passwordSOAPElement = usernameTokenSOAPElement.addChildElement("Password");

    passwordSOAPElement.addTextNode("myPassword");
    ((SoapMessage) soapMessage).setSoapAction("GetMetaDataLookUpRequestType");//exception while casting
}

And my request xml is as below

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://emc.com/it/enterprise/contract/CMCContractLookupService/v1" xmlns:v11="http://emc.com/it/enterprise/data/v1">
   <soapenv:Header>
   <wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

         <wsse:UsernameToken wsu:Id="UsernameToken-20">
            <wsse:Username>xxxx</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxx</wsse:Password>

          </wsse:UsernameToken>
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>

      <v1:GetContractMetaDataLookUpRequest>
         <v11:GetMetaDataLookUpRequestDocument>
            <v11:ContractID>123456</v11:ContractID>
             <v11:BadgeID>1</v11:BadgeID>

         </v11:GetMetaDataLookUpRequestDocument>
      </v1:GetContractMetaDataLookUpRequest>
   </soapenv:Body>
</soapenv:Envelope>

I need help mainly on how can i add that header info(as shown in above xml request) into soap header message.

help is greatly appreciated. thank you.

Upvotes: 2

Views: 3367

Answers (1)

Andreas Veithen
Andreas Veithen

Reputation: 9154

This should be saajSoapMessage.setSoapAction("GetMetaDataLookUpRequestType") instead of ((SoapMessage)soapMessage).setSoapAction("GetMetaDataLookUpRequestType").

Upvotes: 0

Related Questions