在 Spring 客户端中向 SOAP 标头添加安全详细信息



我正在尝试使用Spring WS模板作为客户端来使用SOAP(外部系统(Web服务。

我需要将标头信息(安全详细信息(作为标头与 soap 消息一起传递。

我尝试使用java xml SOAPMessage(

javax.xml.soap.SoapMessage(将该信息添加到Header中,并在添加标头详细信息后尝试将其转换为Spring SOAPMessage(org.springframework.ws.soap.SoapMessage(。

但它无法投射它,获得类投射例外,因为它们都不在继承制中。

请帮助我如何在春季肥皂消息中传递有关标头信息的安全详细信息

我的代码如下

   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
}

我的请求 xml 如下

<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>

我需要帮助主要是关于如何将该标头信息(如上面的 xml 请求所示(添加到 soap 标头消息中。

非常感谢帮助。谢谢。

应该是saajSoapMessage.setSoapAction("GetMetaDataLookUpRequestType")而不是((SoapMessage)soapMessage).setSoapAction("GetMetaDataLookUpRequestType")

最新更新