2008年4月3日木曜日

Apache Axis2 Introduction - volume 2

Axis2 Binary DistributionにはJavaコードからWSDLを生成するjava2wsdlと、WSDLからJavaコードを生成するwsdl2javaというコードがある。これがまた曲者。なぜならAxis2はある意味で独自路線を歩んでいるから。

例えば以前(誰かが)作成したWSDLなWebサービスがあるとする。これはひょっとしたらrpc/encodedなやつかもしれない。REST化する前のYahooのWebサービスなど、encodedなメッセージをやり取りするようにWSDLが書かれていると、wsdl2javaは動作しない(Encoded use is not supported、と出力される)。
何故ならAxis2はdocument/literalなWebサービス・メッセージ交換を念頭に置いているからで、rpc/encodedなWebサービスはAxis1.xでやり終えた感があるから、っぽい。つまり現時点での選択肢は
  • rpc/encodedなWebサービスとやりとりしたい:Axis1.xを利用
  • document/literalなWebサービスとやりとりしたい:Axis2を利用
ということになるものと考える。でもAxis1.xのwsdl2javaってdocument/literal対応していた気がするんだよなぁ。

うーん。。。

製品のマイグレーション・パスを考えるうえで、移行の手段は必要だと思うよ?RPCだったWebサービスをAxis2を使うからDocumentなWebサービスに変えてくれってそれは無理があるし。ひょっとしたらAxis2の開発者はAxis1.xからの移行なんて考えてない、のかもしれない。両方使えるし。Axis2はもうRPCは捨てましたと。

WSDLからのWebサービス生成、特によく言われるトップダウンによるWebサービス構築の手法を取る場合、実はこれは問題にならないわけで...。何故ならWSDLを記述する人、つまりWebサービスを設計する人はrpc/encodedかdocument/literalにするのかは自分が決めるうえ、最近はJSR-181とかもそうだけど、WSDLは作られたJavaコードから自動生成するのが素敵。
つまり問題は「既にあるWebサービスへの接続を考える人」の側にあるわけですね。プロキシを作成するのにwsdl2javaを使うとなると、やはり可能性の高い方向全てに対応しているツールである必要があるんじゃなかろうかと。

うーん。。。まぁいいや。
今回、wsdl2javaを試すのに利用したのは楽天の商品検索サービスのSOAP版。

楽天商品検索API(SOAP開発用) (version:2007-10-25)

事前の設定として、JAVA_HOMEとAXIS2_HOMEを設定する。AXIS2_HOMEはBinary Distributionを展開したディレクトリ。
wsdl2java実行!
D:\tmp\rakutenItemSearch>d:\20_software\axis2-1.3\bin\wsdl2java -uri http://api.
rakuten.co.jp/rws/soap/ItemSearch/2007-10-25?wsdl
Using AXIS2_HOME: d:\20_software\axis2-1.3
Using JAVA_HOME: D:\20_software\jdk
Retrieving schema at 'http://api.rakuten.co.jp:80/rws/soap/ItemSearch/2007-10-25
?xsd=1', relative to 'http://api.rakuten.co.jp/rws/soap/ItemSearch/'.
D:\tmp\rakutenItemSearch>

出来たファイルはAntのbuild.xmlと以下のクラスファイル。少ない…
  • ItemSearch20071025ServiceCallbackHandler.java
  • ExceptionException0.java
  • ItemSearch20071025ServiceStub.java
最後のやつなんか400KB超えちゃって不安なので、データバインディング系ソースを展開する形(-uオプション)を有効にして実行してみる。
Ant入れたりするのが面倒なのでEclipseでソース取り込んで使ってみることにしる。以下、動かすまでにやったこと。
  1. Javaプロジェクト作る
  2. 生成されたソースコードのインポート
  3. AXIS2_HOME/lib内のjarファイルをすべて参照
  4. main文のあるクラス作成
  5. 実行
作ったコードはこんな感じ。
サービス実行例ItemSearch20071025ServiceStub stub
= new ItemSearch20071025ServiceStub();

ItemSearchParam param = new ItemSearchParam();
param.setDeveloperId(DEVELOPER_ID); //ユーザ登録後発行されるもの
param.setApiVersion(API_VERSION); //1.11を指定
param.setKeyword("時計");

OperationItemSearch operation = new OperationItemSearch();
operation.setParam(param);
OperationItemSearch1 operation1 = new OperationItemSearch1();
operation1.setOperationItemSearch(operation);

OperationItemSearchResponse0 response0 = stub.operationItemSearch(operation1);

OperationItemSearchResponse response = response0.getOperationItemSearchResponse();
ItemSearchResult result = response.get_return();

System.out.println("Status:" + result.getStatusMsg());
System.out.println("Count:" + result.getCount());
ItemSearchResultItem[] list = result.getItemArray();
//以下出力用コード


で、こっちが実行結果の抜粋。

実行結果Status:
Count:183759
Name:今年のイチオシ!話題のクロックスサンダル登場!■送料無料■crocs【ケイマン】,Price:3990

おおー。出た。

0 件のコメント: