在迁移旧的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>
如何获取每个标题键值???
1条答案
按热度按时间cu6pst1q1#
经过太多的努力,得到了可行的解决办法:
().....................
}
并且输出将为: