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

bfhwhh0e  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(177)

在迁移旧的Web服务应用程序时,需要将其转换为Sping Boot WS应用程序。并且需要获取SOAP标头(键和值),因此尝试如下:

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>

如何获取每个标题键值???

cu6pst1q

cu6pst1q1#

经过太多的努力,得到了可行的解决办法:
().....................

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

相关问题