本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Axis2 と JiBX を使って Java クラスを Web サービスに変換する: 第 2 回 XML を完全機能の Web サービスに変換する

Axis2 と JiBX を使って Web サービスを生成し、デプロイし、テストする

Tyler Andersonは2004年にBrigham Young Universityにてコンピューター・サイエンスの学位を取得しており、現在はコンピューター・エンジニアリングの修士取得に向けての最終学期を送っています。これまで、DPMG.COMのデータベース・プログラマーとして働いたことがあり、現在はオレゴン州BeavertonにあるStexar Corp.のエンジニアです。

概要: XML は、ほとんど何についてでも定義できるという意味で強力です。しかも、大部分のアプリケーションにとって、特にこのシリーズの目的である Axis2と JiBX にとっては、外部から読み取り可能なフォーマットの基本でもあります。それに加え、Web サービスがより一般的になってきたため、レガシーのJava™ プロジェクトを完全機能の Web サービスに変換することの緊急度が次第に高まっています。これまで、Web サービスの自動生成は1 つのサービスや1 つのクラスに限定されていましたが、現在では、既存のプロジェクトの中にあるさまざまな Java クラスから 1 つ以上のサービスを生成するという選択肢があります。この記事は2 回シリーズの第 2 回として、Axis2 と JiBX を使って、XML から、そして既存の Java クラスから、完全機能の Web サービスへの移行を行います。

このシリーズの他の記事を見る

日付:  2007年 3月 22日
レベル:  中級 この記事の原文:  英語
アクティビティー: 1558 ビュー
お気軽にご意見・ご感想をお寄せください: 


はじめに

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");
        }
    }
}

このクライアントは最初に、クライアント・スタブ・オブジェクトを初期化します。そしてこのオブジェクトを、用意された両方のメソッドに渡します。最初のメソッドOneWayOneWayRequest オブジェクトを作成し、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 codex-jibx2-source.zip24KBHTTP

ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために

  • 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.のエンジニアです。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Java technology, SOA and Web services, Open source
ArticleID=245649
ArticleTitle=Axis2 と JiBX を使って Java クラスを Web サービスに変換する: 第 2 回 XML を完全機能の Web サービスに変換する
publish-date=03222007
author1-email=tyleranderson5@yahoo.com
author1-email-cc=dwxed@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。