レベル: 中級 Tyler Anderson (tyleranderson5@yahoo.com), Freelance writer
2007年 3月 22日 XML は、ほとんど何についてでも定義できるという意味で強力です。しかも、大部分のアプリケーションにとって、特にこのシリーズの目的である Axis2と JiBX にとっては、外部から読み取り可能なフォーマットの基本でもあります。それに加え、Web サービスがより一般的になってきたため、レガシーのJava™ プロジェクトを完全機能の Web サービスに変換することの緊急度が次第に高まっています。これまで、Web サービスの自動生成は1 つのサービスや1 つのクラスに限定されていましたが、現在では、既存のプロジェクトの中にあるさまざまな Java クラスから 1 つ以上のサービスを生成するという選択肢があります。この記事は2 回シリーズの第 2 回として、Axis2 と JiBX を使って、XML から、そして既存の Java クラスから、完全機能の Web サービスへの移行を行います。
はじめに
Apache Axis2 は、いくつかの XML ソリューションを提供しており、このソリューションによって Web サービスの開発がより容易なものになり、またより強力に行うことができるようになります。Axis2は Web サービスを実装する際の理想的な選択肢であり、また、Apache Axis2 と Apache Geronimo の組み合わせは、どちらも無料でオープン・ソースであることから、有力な選択肢として考慮する価値があります。
このシリーズの前回の記事では、この 2 回シリーズで使用する Java クラスを導入しました (「参考文献」を参照)。このクラスを WSDL を使って Web サービスとして公開し、そして Web サービスをテストするための、今回の記事の JiBXデータ・バインディングと通信するJiBX 定義記述を作成しました。今回のテスト・プロセスでは、JiBX バインディング・クラスをコンパイルしてラッパー・クラスを作成し、データ・バインディング・クラスをWeb サービス全体の機能部分にします。
先に進む前に、<axis2_home>/lib にあるすべての JAR (このシリーズの第 1 回でコピーした、JiBX の JARを含めて) がクラスパスにあること、そしてこの記事での操作の間、それが変わらないことを確認します。また、システムに Ant がインストールされていることも確認します。Antは Apache からダウンロードすることができます (「参考文献」を参照)。
では早速、サービスを生成することにしましょう。
サービスを生成する
まず、Axis2 でサービスを生成する必要があります。このサービスを、後ほど作成するクライアントでテストします。前回の記事の最初の部分で、必要なツールは既にダウンロードしてあり、AXIS2_HOME環境変数も設定されているはずです。作業を開始し、サービスを作成するために、リスト 1 の命令を入力します。
リスト 1. サービスを作成する
java org.apache.axis2.wsdl.WSDL2Java
-uri C:\apps\webapps\IBM-JiBX\SimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService -d jibx -s -ss -sd -ssi
-Ebindingfile ../binding.xml
|
これによって、必要最低限のサービスが生成されるはずです。上記で使用されているさまざまなスイッチの説明は、下記のとおりです。
-
-uri スイッチは Axis2 に対して、サービスの生成元となる WSDL ファイルをどこで見つけるかを指示します。
-
-p スイッチは Axis2 に対して、サービスに使用する Java パッケージ・クラスを指示します。
-
-d jibx オプションは JiBX データ・バインディングを指定します。
-
-s スイッチは、同期 (ブロッキング) メソッドのみが使用可能であることを指定します。
-
-ss スイッチは Axis2 に対して、サーバー・サイド・コードを作成するように指示します。
-
-sd スイッチは Axis2 に対して、サービス記述子 (services.xml file) を作成するように指示します。
-
-ssi スイッチはオプションであり、単純にサービス実装のための Java インターフェース (SimpleServiceSkeleton.java)を作成します 。
-
-Ebinding スイッチは Axis2 に対して、JiBX 定義記述ファイルをどこで見つけるかを指示します。
これで Web サービスは用意できましたが、まだ何も定義されていません。そこで、その定義を次のセクションで行います。
サービス・スケルトンを定義する
Web サービスの操作が正常に呼び出されると、サービス・スケルトンのメソッドは必ず呼び出されます。Web サービスのアクションのための実装コードは、(この場合は)下記の SimpleServiceSkeleton.java と呼ばれるファイルの中に入ります。src/com/ibm/devWorks/xml/simpleServiceディレクトリーを見ると、このファイルは空であることがわかります。これを、リスト 2 のように定義します。
リスト 2. サービス・スケルトンを定義する
package com.ibm.devWorks.xml.simpleService;
public class SimpleServiceSkeleton implements SimpleServiceSkeletonInterface{
public void OneWay
(
com.ibm.devWorks.xml.simpleService.OneWayRequest OneWayRequest
)
{
System.err.println("Request data: " +
OneWayRequest.getRequestData());
}
public com.ibm.devWorks.xml.simpleService.TwoWayResponse TwoWay
(
com.ibm.devWorks.xml.simpleService.TwoWayRequest TwoWayRequest
)
{
System.err.println("Echo String : " +
TwoWayRequest.getEchoString());
System.err.println("Booolean : " +
TwoWayRequest.getBooolean());
TwoWayResponse res = new TwoWayResponse();
res.setEchoString(TwoWayRequest.getEchoString());
res.setInvertedBoolean(!TwoWayRequest.getBooolean());
return res;
}
}
|
リスト 2 のコードは、この 2 回シリーズの前回の記事で説明した各操作に対して、2 つのメソッドを持っています (「参考文献」を参照)。最初のメソッド、OneWay は、Java オブジェクト OneWayRequest をパラメーターとして使いますが、(これは片方向、あるいは入力のみの操作であるため) 何も返しません。この実装では、クライアントから送信されたものを単純に画面に表示します。
2 番目のメソッド、TwoWay は、Java オブジェクト TwoWayRequest を取得し、レスポンスとして TwoWayResponse を返します。このメソッドは最初、受信されるリクエスト・オブジェクトの echoString フィールドと booolean フィールドを表示し、レスポンスの echoString をリクエストの中の echoString フィールドの値に設定し、レスポンス・オブジェクトの中の invertedBoolean の値を、リクエスト・オブジェクトの booolean の値を反転した値に設定します (偽は真になり、真は偽になります)。そしてレスポンス・オブジェクトがクライアントに返されます。
これでサービスが定義できました。次はサービスを作成し、そして JiBX データ・バインディング・ラッパー・クラスを作成します。
JiBX データ・バインディングを仕上げる
JiBX データ・バインディング・ラッパー・クラスをコンパイルして作成する前に、まずクラス自体をコンパイルする必要があります。プロジェクトをコンパイルするためには、ant と入力します。
今度はラッパー・クラスを作成するために build/classes ディレクトリーに切り替え、java -jar <axis2_home>\lib\jibx-bind.jar ..\..\..\binding.xml と入力します。
そうすると、4 つの新しい JiBX_* クラス・ファイルに気が付くはずです。これでラッパー・クラスが作成されました。今度は Axis2 サービス・アーカイブを再パッケージするために、(前と同じディレクトリーで)ant を入力します。
ここで、実際にはコードを 2 度ビルドするわけではないことに注意してください。今回は、Ant はコードが既にビルドされていることを知っています。しかしAnt は新しいファイルを見つけ、Axis2 アーカイブ・ファイルを再パッケージしてくれます。
これでサービスを Geronimo にデプロイする準備ができたので、次は Geronimo にデプロイします。
Geronimo にデプロイする
今度は、たった今作成され、コンパイルされたサービスをデプロイします。もし現在 Geronimo が実行されていなければ、java -jar <geronimo_home>/bin/server.jar と入力して Geronimo を起動します。
今度は、サービス・アーカイブ・ファイル build/lib/SimpleService.aar を、<geronimo_home>/repository/default/axis2/1166439304031/axis2-1166439304031.war/WEB-INF/servicesにコピーします (正確なディレクトリーは異なるかもしれません)。
まもなく、サービスが自動デプロイされます。これで、クライアントを使ってテストする準備が整ったので、次はクライアントを作成します。
クライアントを生成する
クライアントを使うことで、Web サービスの機能と、そのサービスが適切にデプロイされているかをテストすることができます。そこで、デプロイされたWeb サービスをテストするためのクライアントを、この場合も JiBX データ・バインディングを使って作成します。
Web サービスを生成するために、リスト 3 の内容を入力します。
リスト 3. Web サービスを生成する
java org.apache.axis2.wsdl.WSDL2Java
-uri C:\apps\webapps\IBM-JiBX\SimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService
-d jibx -Ebindingfile ../binding.xml -s
|
上記のコマンドは、単純にクライアント・スタブ・コードを作成します。ここで使用されているスイッチの説明は、「サービスを生成する」を見てください。次に、Web サービスをテストするために使用する、実際のクライアント・コードを定義します。
テスト・コードを作成する
今度は、Web サービスが正常にデプロイされたことをテストするためのコードを、先ほど JiBX データ・バインディングを使って作成した、クライアント・スタブを使って作成します。src/com/ibm/devWorks/xml/simpleService/Client.javaファイルを作成し、それを定義します (リスト 4)。
リスト 4. クライアント・スタブとデプロイされた Web サービスとをテストする
package com.ibm.devWorks.xml.simpleService;
public class Client{
public static void main(java.lang.String args[]){
try{
SimpleServiceStub stub =
new SimpleServiceStub
("http://localhost:8080/axis2/services/SimpleService");
oneWay(stub);
twoWay(stub);
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void oneWay(SimpleServiceStub stub){
try{
OneWayRequest req = new OneWayRequest();
req.setRequestData("Here is your requested data!");
stub.OneWay(req);
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void twoWay(SimpleServiceStub stub){
try{
TwoWayRequest req = new TwoWayRequest();
req.setEchoString("echo! ... echo!");
req.setBooolean(false);
TwoWayResponse res = stub.TwoWay(req);
System.out.println("Echo String : " +
res.getEchoString());
System.out.println("Inv Boolean : " +
res.getInvertedBoolean());
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
}
|
このクライアントは最初に、クライアント・スタブ・オブジェクトを初期化します。そしてこのオブジェクトを、用意された両方のメソッドに渡します。最初のメソッドOneWay は OneWayRequest オブジェクトを作成し、requestData フィールドを、Here is your requested data! という値で初期化します。このデータは次にサーバーに送信されますが、(これは片方向操作なので)返されることはありません。
2 番目のメソッド、twoWay は、TwoWayRequest オブジェクトを作成し、echoString フィールドと booolean フィールドを初期化します。次にリクエスト・オブジェクトはサービスに送信され、そしてサービスは TwoWayResponse オブジェクトを返します。レスポンス・オブジェクトの中の echoString の値は、(リスト 1 で定義した論理によれば) リクエスト・オブジェクトの中の echoString の値に一致するはずであり、またレスポンス・オブジェクトの中の invertedBoolean は、リクエスト・オブジェクトの中の booolean フィールドの値を反転した値 (つまりこの場合は真) のはずです。
これでクライアントの定義が完成しました。今度は、サービスの場合と同じく、JiBX バインディング・ラッパー・クラスをコンパイルする必要があります。
JiBX データ・バインディングを仕上げる
クライアント用の JiBX データ・バインディング・ラッパー・クラスをコンパイルし、作成する前に、まずクラス自体をコンパイルする必要があります。プロジェクトをコンパイルするためには、ant と入力します。
今度はラッパー・クラスを作成するために build/classes ディレクトリーに切り替え、java -jar <axis2_home>\lib\jibx-bind.jar ..\..\..\binding.xml と入力します。
サービスの場合と同じように、4 つの新しい JiBX_* クラス・ファイルが作成されていることに気が付くはずです。クライアント・コードを含む JAR ファイルを再パッケージするために、(前と同じディレクトリーで)ant と入力します。
これですべて終わりです。あとは、すべてをテストするのみです。
テストする
上記で定義したばかりのクライアント・コードを実行すると、適切な出力が画面上に表示されるはずです。クライアントを実行する前に、クライアント・コードを含むJAR (build/lib/SimpleService-test-client.jar) がクラスパスにあることを確認します。
クライアントを実行するためには、java com.ibm.devWorks.xml.simpleService.Client と入力します。
そうすると、サービスからの出力が表示されるはずです (図 1)。
図 1. サービスからの標準出力の結果を表示する
正しい値がサービスに送信されたことに注目してください。今度はクライアント出力を調べ、この同じ正しい値がクライアントに戻るかどうかを検証します(図 2)。
図 2. クライアントの出力を表示する
すべてが見事に動作しています。これで JiBX の魔術を行う準備が完了しました。
まとめ
これで皆さんも JiBX-Axis2 Web サービスの開発者です。皆さんの好みの Java クラスを、Axis2 と JiBX を使って Webサービスに変換できるようになりました。
この 2 回シリーズの記事では、WSDL を使って Java クラスを公開し、それを JiBX 定義記述を使って XML データにマップしました。この記事ではライブWeb サービスを作成し、Axis2 と Geronimo を使ってデプロイしました。そして最終的な実装をテストするために、Axis2 を使ってクライアントを作成し、実行しました。そして、クライアントとサービスの両方に対してJiBX データ・バインディングを指定し、それぞれに対してデータ・バインディング・ラッパー・クラスを適切に作成しました。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Part 2 sample code | x-jibx2-source.zip | 24KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
- XML ベースの構成ファイルを使う、オープンソースで Java ベースのビルド・ツール、antをダウンロードしてください。
- Web サービスのためのコア・エンジン、Apache Axis2をダウンロードしてください。
- XML データを Java にバインドするための JiBX フレームワーク、JiBX 1.1をダウンロードしてください。
- 使いやすい、オープンソースのサーバー、Geronimo 1.1.1を入手してください。
- JiBX のホームページから、JiBX の SOAP Web サービス実装、JiBXSoapを入手してください。
議論するために
著者について  | |  | Tyler Andersonは2004年にBrigham Young Universityにてコンピューター・サイエンスの学位を取得しており、現在はコンピューター・エンジニアリングの修士取得に向けての最終学期を送っています。これまで、DPMG.COMのデータベース・プログラマーとして働いたことがあり、現在はオレゴン州BeavertonにあるStexar Corp.のエンジニアです。 |
記事の評価
|