ネームスペースがoperationタグ内で定義されている場合、SOAPメッセージのCastorアンマーシャリングをどのように処理できますか?
-
06-07-2019 - |
質問
Spring-WSに基づくコントラクトファーストWebサービスを開発しています。私はCastorマーシャリングに依存していますが、次の問題に遭遇しました。
" xmlns"名前空間は、次のようにEnvelopeタグで定義されます。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns="http://www.mycompany.com/MyService/schemas">
<soap:Header/>
<soap:Body>
<doPlaceHoldRequest>
<hold>
<accountInfo>
<accountNumber>123456789</accountNumber>
</accountInfo>
<extended>false</extended>
<afterHours>false</afterHours>
<amountSavings>1.00</amountSavings>
<amountChecking>0.00</amountChecking>
</hold>
</doPlaceHoldRequest>
</soap:Body>
</soap:Envelope>
ただし、Spring-WSが提供する.wsdlから生成された.NETおよびJavaクライアント(XSDから生成された)は、次の方法で要求を形成します。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<doPlaceHoldRequest
xmlns="http://www.mycompany.com/MyService/schemas">
<hold>
<accountInfo>
<accountNumber>123456789</accountNumber>
</accountInfo>
<extended>false</extended>
<afterHours>false</afterHours>
<amountSavings>1.00</amountSavings>
<amountChecking>0.00</amountChecking>
</hold>
</doPlaceHoldRequest>
</soap:Body>
</soap:Envelope>
Castorによってアンマーシャリング例外がスローされます。これらのメッセージが有効であるとCastorに認識させるにはどうすればよいですか? WSDL(または自動生成に使用したXSD)が間違っている可能性はありますか?
解決
このブログをご覧になった場合、他のウェブサービスにアクセスすることはないでしょう:) http://springkbase.blogspot.com/2009/06/ spring-webservice-with-castor.html
他のヒント
最初のSpring-WS / Castor Webサービスでこの問題に何度も遭遇しました。私の知る限り、コンポーネントは名前空間を意識しない方法でペイロードを抽出します。言い換えると、doPlaceHoldRequestのようなノードは、最上位の名前空間宣言を継承せずにXMLドキュメントのルートになり、上記の2つのケースでは、目的の名前空間にある になります。 1つはそうではありません-したがって、1つはスキーマに対して正常に検証され、もう1つは検証されません。
最善の解決策は、すべてのベースをカバーすることです。 XSDにelementFormDefault =&quot; qualified&quot;を設定し、すべての要素がネームスペースにあることを要求します。次に、Castorマッピングのすべてのmap-to要素でns-uriとns-prefixを指定します。結果は、すべての名前空間プレフィックスを使用して少し重くなりますが、サーバーコンポーネントでの遅延クライアント の文書化されていない動作に関しては、脆弱性がはるかに少なくなるようです。
JAX-WSが空のリストを返すが良い点です。も。 org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor
は、出入りするものを検証する価値があります。