SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オープンソースApache Tuscanyで楽しむSOA

オープンソースApache Tuscanyで楽しむSOA
第6回「WSDLを使用してWebサービスでワイヤリングしましょう」

既に存在するWebサービスを使用してコンポーネント同士をワイヤリング

ダウンロード サンプルコード (20.0 KB)

WSDLとコンポジットファイルの対応関係

 WSDLを知っている方、または前ページの説明を読んだ方にはWSDLとコンポジットファイルを対応付けることは難しくはありません。ただし、対応付けるための日本語のマニュアルやインターネットのサイトがないため、コンポジットファイルをどのように書けばよいか分からず、筆者は3日間の試行錯誤が続きました。一度成功してしまえば、簡単なことに驚きます(英語のマニュアルやサイトはあるのですが、説明どおり指定してもできませんでした)。

WSDLで使用する項目

 コンポジットファイルを記述する上で必要なWSDLの項目は図7の4項目のみです。wsdl:typeswsdl:messagewsdl:bindingの項目は使用しないため折りたたんで表示しています。

図7.コンポジットファイルと対応付けるWSDLの項目
図7.コンポジットファイルと対応付けるWSDLの項目

コンポジットファイル記述

図8.コンポジットファイルの変更箇所
図8.コンポジットファイルの変更箇所

対応関係

 図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プログラムを起動してもエラーメッセージもなくサーバが起動するのです。

図9.コンポジットファイルに誤りがある場合でも起動ログにはエラーメッセージは表示されない
図9.コンポジットファイルに誤りがある場合でも起動ログにはエラーメッセージは表示されない

 この現象は非常に悩ましく、トスカーナワイン店の画面は表示されるのですが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ファイルのみです。

図10.プロジェクトのフォルダ構成
図10.プロジェクトのフォルダ構成

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

修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
オープンソースApache Tuscanyで楽しむSOA連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4602 2009/12/09 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー