IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML | Java technology | SOA and Web services | Open source  >

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

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

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 中級

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

このクライアントは最初に、クライアント・スタブ・オブジェクトを初期化します。そしてこのオブジェクトを、用意された両方のメソッドに渡します。最初のメソッド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 の魔術を行う準備が完了しました。




上に戻る


まとめ

この記事を共有する

digg Digg へ投稿
del.icio.us del.icio.us へ投稿
Slashdot Slashdot へ投稿

これで皆さんも 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.のエンジニアです。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


上に戻る


    日本IBMについて プライバシー お問い合わせ