繁体   English   中英

如何从 MessageContext 获取 SOAP 标头 - 在 Spring Boot WS 应用程序中

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

在迁移旧的 Web Service 应用程序时,需要将其转换为 Spring Boot WS 应用程序。 并且需要获取 SOAP 标头(Key & Value),所以尝试如下:

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

但它没有为外部节点以及以下 SOAP 请求 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>

我怎样才能得到每个标题键=值??? 在此处输入图像描述

经过太多努力,得到了解决方案:

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;

}

输出将是:

clientID, xyz
wsdlVersion, 1.0
serviceType, ExampleService_v1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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