如何在标头中包含SOAP身份验证详细信息?

这是我的SOAP请求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header>
        <Security>
            <UsernameToken>
                <SiteId>testlab1</SiteId>
                <Password>abcd1234</Password>
            </UsernameToken>
        </Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body 
    xmlns:ns3="http://www.foo.bar/ws"
    xmlns:ns5="http://http://www.foo.bar.com" 
    xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope">
        <ns5:RequestObject>
            <ns3:Header>
                <AccountNo>637557000000169</AccountNo>
                <CustomerId>Y11228</CustomerId>
                <SiteId>testlab1</SiteId>
                <RegisterId>0</RegisterId>
                <SequenceNumber>1</SequenceNumber>
                <Retry>0</Retry>
            </ns3:Header>
        </ns5:RequestObject>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

它适用于SOAP UI工具.但是当它使用spring-ws的WebServiceTemplate自动生成时,它不包括:

<Security>
   <UsernameToken>
        <SiteId>testlab1</SiteId>
        <Password>abcd1234</Password>
   </UsernameToken>
</Security>

部分在< SOAP-ENV:Header>中.
有没有我可以通过我的代码包含这些身份验证详细信息?
任何帮助将不胜感激 !!

最佳答案 如果您使用的是spring-ws的WebServiceTemplate,那么您可以尝试添加WebServiceMessageCallback并覆盖doWithMessage().就像是 :

getWebServiceTemplate().marshalSendAndReceive("https://soap.endpoint",
    requestObj, new WebServiceMessageCallback() {

                    public void doWithMessage(WebServiceMessage message) {
                        try {
                            SoapMessage soapMessage = (SoapMessage)message;
                            SoapHeader header = soapMessage.getSoapHeader();
                            StringSource headerSource = new StringSource("<Security><UsernameToken><SiteId>testlab1</SiteId>"+
"<Password>abcd1234</Password></UsernameToken></Security> ");
                            Transformer transformer = TransformerFactory.newInstance().newTransformer();
                            transformer.transform(headerSource, header.getResult());
                        } catch (Exception e) {
                            // exception handling
                        }
                    }
                });

希望在这里解决您的要求!

点赞