2009-03-09 6 views
2

私は、Spring-WSに基づいて、契約型の最初のWebサービスを開発しています。私はCastorのマーシャリングに頼っています。私は以下の問題にぶつかりました。操作タグ内で名前空間が定義されている場合、SOAPメッセージのCastorの非マーシャリングはどのように処理できますか?

<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> 

しかし、.NETとJavaの両方のクライアントがスプリング-WS(によって提供されるの.wsdlから発生する次のような名前空間はエンベロープタグで定義されている「のxmlns」は、場合

要求が受け入れられていますこれは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にこれらのメッセージを有効と認識させるにはどうすればよいですか?私のWSDL(またはそれを自動生成するために使用したXSD)が間違っていますか?

+0

これまでのところ、私は普通の古いJax-WSに切り替えましたが、それは魅力的なように機能しています。私は再びSpring-WSとCastorに触れるつもりです...そのような頭痛! –

+1

これらの2つのXML文書は、名前空間の宣言位置の違いにもかかわらず、意味的に同じです。 Castorが好きではないが、他の人が好きなら、Castorは壊れています。私の経験上、Spring-WSが最適なオプションです.JAX-WSはあまりにも大変です。 – skaffman

答えて

2

に行くことは決してありません表示された場合、私は私の最初の春-WS /キャスターのWebサービスと何度も何度もこの問題に遭遇しました。私が知る限り、ラインのどこかにあるコンポーネントは、名前空間を認識しない方法でペイロードを抽出します。言い換えれば、doPlaceHoldRequestのようなノードは、最上位の名前空間宣言を継承せずにXML文書のルートになり、上の2つのケースでは、であるものと、必要でないもの - あなたのスキーマに対して妥当性を検証するものと、そうでないものがあります。

最高の解決策は、すべてのベースをカバーするように思われます。すべての要素が名前空間に入るようにするには、XSDにelementFormDefault = "qualified"を設定します。次に、Castorマッピングのすべてのmap-to要素にns-uriとns-prefixを指定します。その結果は、すべての名前空間接頭辞を使って少し重くなりますが、遅いクライアントの場合は、サーバのコンポーネントでは文書化されていない動作のため、怠惰なクライアントになることが少なくあります。および

JAX-WS return empty listsも良い点です。 org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptorは、出入りするものを検証する価値があります。

関連する問題