简体   繁体   中英

How to get SOAP headers from MessageContext - In Spring Boot WS Application

While working on the migration of an old Web Service application, need to convert it into a Spring Boot WS application. And need to get SOAP headers (Key & Value), so tried as:

import javax.wsdl.Message;
import javax.xml.namespace.QName;
import javax.xml.transform.Result;
import javax.xml.transform.Source;

import org.apache.cxf.jaxws.context.WrappedMessageContext;
import org.springframework.ws.context.DefaultMessageContext;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.EndpointInterceptor;
import org.springframework.ws.soap.SoapBody;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.xml.namespace.QNameUtils;

public class LogHttpHeaderEndpointInterceptor implements EndpointInterceptor {

    @Override
    public boolean handleRequest(MessageContext messageContext, Object arg1) throws Exception {
        SoapHeader soapHeader = ((SoapMessage) messageContext.getRequest()).getSoapHeader();

        Iterator<SoapHeaderElement> soapHeaderElementIterator = soapHeader.examineAllHeaderElements();
        while (soapHeaderElementIterator.hasNext()) {
            SoapHeaderElement soapHeaderElement = soapHeaderElementIterator.next();
            Iterator<QName> allAttributes3 = soapHeaderElement.getAllAttributes();

            while (allAttributes3.hasNext()) {
                QName qName = (QName) allAttributes3.next();
                System.out.println();
                System.out.println("    LocalPart: " + qName.getLocalPart());
                System.out.println("    NamespaceURI: " + qName.getNamespaceURI());
                System.out.println("    Prefix: " + qName.getPrefix());
                System.out.println("    ToString(): " + qName.toString());
                System.out.println();
            }
            System.out.println("Header Name: " + soapHeaderElement.getName());
            System.out.println("Text: " + soapHeaderElement.getText());
            String attributeValue = soapHeaderElement.getAttributeValue(soapHeaderElement.getName());
            System.out.println("Header Value: " + attributeValue);
            Iterator<QName> allAttributes = soapHeaderElement.getAllAttributes();
            while (allAttributes.hasNext()) {
                QName qName = (QName) allAttributes.next();
                System.out.println();
                System.out.println("    LocalPart: " + qName.getLocalPart());
                System.out.println("    NamespaceURI: " + qName.getNamespaceURI());
                System.out.println("    Prefix: " + qName.getPrefix());
                System.out.println("    ToString(): " + qName.toString());
                System.out.println();
            }
        }

        return true;
    }
}

But it's not giving the value for the outer node as well as for the inner children of the below SOAP request XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gen="http://www.baeldung.com/springsoap/gen">
   <soapenv:Header>
      <CustomHeaderElement>
         <clientID>xyz</clientID>
         <wsdlVersion>1.0</wsdlVersion>
         <serviceType>ExampleService_v1</serviceType>
      </CustomHeaderElement>
   </soapenv:Header>
   <soapenv:Body>
   </soapenv:Body>
</soapenv:Envelope>

How can I get each header key=value ??? 在此处输入图像描述

After too much efforts, got the solution to be working:

protected Map<String, String> extractUserDefinedHeaders(SoapHeader soapHeader) { Map<String, String> headers = new HashMap<String, String>();

Iterator<?> elementIter = soapHeader.examineAllHeaderElements();
while (elementIter.hasNext()) {
    Object element = elementIter.next();
    if (!(element instanceof SoapHeaderElement)) {
        continue;
    }

    Result result = ((SoapHeaderElement) element).getResult();
    if (!(result instanceof DOMResult)) {
        continue;
    }

    NodeList nodeList = ((DOMResult) result).getNode().getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        if (node.hasChildNodes()) {
            String nodeName = node.getNodeName();
            String nodeValue = node.getFirstChild().getNodeValue();
            headers.put(nodeName, nodeValue);
            System.out.println(nodeName + ", " + nodeValue);
        }
    }
}
return headers;

}

and the output will be as:

clientID, xyz
wsdlVersion, 1.0
serviceType, ExampleService_v1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM