0

spring-ws を使用して Web サービスをヒットしようとしていますが、Web サービス プロデューサーは SOAP ヘッダーにカスタム要素を必要とします。私は Web サービスに非常に慣れていないため、soap ヘッダーに値を挿入しようとして問題が発生しています。私は XMLBeans を使用して xsd から Java に変換し、マーシャリングとアンマーシャリングも行っています。xmlbean ドキュメントを構築し、カスタム ヘッダー要素のすべての値を設定しました。ドキュメントを取得するか、そのドキュメントに添付された要素だけを取得して SOAP ヘッダーに挿入する必要があります。以下にリストされているのは、soapui の wsdl (ヘッダーのみ) です (以前に学習して初期テストを行ったもの)。

<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

SoapHeader次のように、 の Result にマーシャリングできます。

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

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