WSDLとコンポジットファイルの対応関係
WSDLを知っている方、または前ページの説明を読んだ方にはWSDLとコンポジットファイルを対応付けることは難しくはありません。ただし、対応付けるための日本語のマニュアルやインターネットのサイトがないため、コンポジットファイルをどのように書けばよいか分からず、筆者は3日間の試行錯誤が続きました。一度成功してしまえば、簡単なことに驚きます(英語のマニュアルやサイトはあるのですが、説明どおり指定してもできませんでした)。
WSDLで使用する項目
コンポジットファイルを記述する上で必要なWSDLの項目は図7の4項目のみです。wsdl:types、wsdl:message、wsdl:bindingの項目は使用しないため折りたたんで表示しています。
コンポジットファイル記述
対応関係
図8のAからDまでのコンポジットファイルの指定は、図7のWSDLファイルのAからDに相当します。
Basketコンポーネントのreference要素の指定
まずは、Basketコンポーネントのreference要素から説明します。第5回では、target属性を指定していましたが削除しています。また、その子要素のbinding:ws要素は、属性も要素内容も指定しない空の要素でした。今回は、属性としてwsdlElementを追加しています。この要素を追加することで、今まで自動生成されていたwsdlに代り、wsdlの指定に従うことになります。http://wine.kawakubo.jp/#wsdl.port(CalcChargeService/CalcChargePort)のwsdl.portの後に指定するサービスを利用することを宣言しています。ここで最初に躓くのが、wsdl.portの前に何を指定するかです。localhost上に両コンポーネントが存在する場合、直感的にはhttp://localhost/CalcCharge#wsdl.portと指定すれば、CalcChargeという名称のWSDLファイルからwsdl:service要素とwsdl:port要素を参照してくれると考えがちですが、これではうまく動作しません。図9を見ても分かるとおり、mainプログラムを起動してもエラーメッセージもなくサーバが起動するのです。
この現象は非常に悩ましく、トスカーナワイン店の画面は表示されるのですがCalcChargeのgetChargeがうまく動いていないようで、送料や合計金額を表示するテーブルすら画面に出ません。インターネットで調べること1日、wsdl.portの前に指定するのは、WSDLのtargetNamespaceであることが分かりました。これも指摘されればすぐに納得できるものですが、多くのことを試みているうちに迷宮に入っていく間違いの1つです。
これで解決と確信したのですが、http://wine.kawakubo.jp/とするところをhttp://wine.kawakubo.jpと最後のスラッシュを入れ忘れたために2時間原因究明に追われました。やはり、この場合もエラーメッセージが表示されません。wsdlElement自体の書き方に不備があるのではと思い、悪戦苦闘したのですが、意外とこの手の間違いは多いらしく、ネットで探し当てることができ、正確にWSDLのtargetNamespaceを記述しないといけないことが分かりました。
CalcChargeコンポーネントのservice要素の指定
第5回と大きく違うのは、子要素にinterface.wsdlを追加したことです。その属性のwsdlLocationはWSDLの場所を指定します。ここで示した例ではWSDLファイルがコンポジットファイルとフォルダ内に存在している場合です。次のinterface属性もBasketのreference属性と同様、#wsdl.interfaceの前に何を指定するかという問題がありますが、片方が解決すれば、もう片方も解決する問題なので、WSDLのtargetNamespaceを指定することで解決しました。次に悩んだのがwsdl.interfaceには何を指定すればいいのかですが、これはWSDLの要素に対応しているはずということは容易に判断でき、wsdl:portTypeの名前を指定することで解決できました。
上記を読んでもその苦労は伝わらないと思いますが、思った以上にWSDLとコンポジットファイルの対応関係を理解するのに時間がかかりました。ただし、前回の繰り返しになりますが、失敗してこそ分かるものは多く、失敗した場合にログに出てくる裏方で働いているクラスの存在は理解を深めるうえで多いに役立ちました。どのようなクラスが動いているかを知りたい方は、わざと記述を間違えて、ログを観察されることをお薦めします。
上記のとおりコンポジットファイルを指定すれば、第5回と同じ画面、同じ機能になります。サンプルコードをページのトップに用意しているので、ご利用ください。プロジェクトのフォルダ構成は図10のとおりです。第5回との差異は、wineshop.compositeファイルとCalcCharge.wsdlファイルのみです。

次回は、ワイヤリングの話から離れ、Javaで書いたコードをJRubyに置き換える方法を説明します。



