0

我正在尝试使用 spring-ws 访问 web 服务,但是 web 服务生产者需要在 soap 标头中添加一个自定义元素。我对 web 服务非常陌生,并且在尝试将值注入到 soap 标头中时遇到了麻烦。我正在使用 XMLBeans 从 xsd 转换为 java 并进行编组和解组。我已经构建了 xmlbean 文档并为自定义标头元素设置了所有值,我只需要获取该文档,甚至可能只是将附加到该文档的元素注入到 soap 标头中。下面列出的是soapui中的wsdl(只是header)(我用来学习和做初步测试的)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0" xmlns:v11="http://www.ups.com/XMLSchema/XOLTWS/Rate/v1.1" xmlns:v12="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0">
   <soapenv:Header>
      <v1:UPSSecurity>
         <v1:UsernameToken>
            <v1:Username>name</v1:Username>
            <v1:Password>password</v1:Password>
         </v1:UsernameToken>
         <v1:ServiceAccessToken>
            <v1:AccessLicenseNumber>accesskey</v1:AccessLicenseNumber>
         </v1:ServiceAccessToken>
      </v1:UPSSecurity>
   </soapenv:Header>
4

3 回答 3

1

我找到了一个可行的解决方案,而且代码不多。我不得不放弃使用 xmlbeans,只创建元素,但至少功能在那里并且 web 服务调用有效。

@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException
{
    try
    {
        SOAPMessage soapMessage = ((SaajSoapMessage)message).getSaajMessage();
        SOAPHeader header = soapMessage.getSOAPHeader();
        SOAPHeaderElement soapHeaderElement = header.addHeaderElement(new QName("http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0", "UPSSecurity", "v1"));
        SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
        envelope.addNamespaceDeclaration("v1", "http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0");

        SOAPElement usernameToken = soapHeaderElement.addChildElement("UsernameToken", "v1");
        SOAPElement username = usernameToken.addChildElement("Username", "v1");
        SOAPElement password = usernameToken.addChildElement("Password", "v1");

        SOAPElement serviceAccessToken = soapHeaderElement.addChildElement("ServiceAccessToken", "v1");
        SOAPElement accessLicenseNumber = serviceAccessToken.addChildElement("AccessLicenseNumber", "v1");

        username.setTextContent("username");
        password.setTextContent("password");
        accessLicenseNumber.setTextContent("key");
    } 
    catch (SOAPException e)
    {
        e.printStackTrace();
    }
}
于 2015-06-14T04:10:57.160 回答
0

您可以编组到 aSoapHeader的结果,如下所示:

SoapMessage msg = ...
SoapHeader header = msg.getSoapHeader();

XmlBeansMarshaller marshaller = ...
MyXmlBeansDocument doc = ...
marshaller.marshal(doc, header.getResult());
于 2015-06-15T09:45:42.750 回答
0

您可以使用以下工厂方法将 XmlObject(XmlBeans 模型)转换为 SOAPElement:

YourModel xmlObject = YourModelDocument.Factory.newInstance().addNewYourModel();
SOAPElement soapElement = SOAPFactory.newInstance()
        .createElement((Element) xmlObject.getDomNode());

XmlObject必须是文档的一部分,否则将getDomNode()返回一个XmlFragment而不是一个Element

一旦转换为 SOAP 元素,就可以使用addChildElement(). 例如:

SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
soapMessage.getSOAPBody().addChildElement(soapElement);
于 2020-10-10T09:56:03.847 回答