連載
» 2003年03月11日 00時00分 公開

WSDLをうまく使いWebサービスをオートマ運転パソコンで試してわかるWebサービス(7)(3/4 ページ)

[イチロー,樋口研究室監修]

WSDLファイルからクライアント用クラスを自動生成

 そろそろ「オチ」が見えてきたと思います。AxisにはWebサービス・クライアント用のクラスをWSDLから自動生成する機能が用意されています。第6回ではBeanからWSDLを生成するのに「Java2WSDL」というツールを使いましたが、今回はその逆です。WSDLからJavaのクラスを生成するので、「WSDL2Java」というツールを使います。このツールを使って「オートマ運転」をやってみることにしましょう。

 毎度のことになりますが、ホームディレクトリを<@WORK>に移動して、環境変数を設定してください(この辺が分からない方は第1回〜第3回を読んでください)。前回でWSDLファイルができているはずです。<@WORK>ディレクトリにSimpleAddService.wsdlファイルはありますか?

 このファイルがあることを確認して、次のコマンドを実行します。

  ●Java2WSDLコマンド(1行に記述して実行)
> java org.apache.axis.wsdl.WSDL2Java SimpleAddService.wsdl

 正常終了すると、<@WORK>ディレクトリの中に「SimpleAddService」というディレクトリができているはずです。その中を見てください。4つのJavaファイルができていますか?

 生成されたファイルは次の4つです。

(1) AdminServletSoapBindingStub.java
(2) SimpleAddBean.java
(3) SimpleAddBeanService.java
(4) SimpleAddBeanServiceLocator.java

 この4つのファイルを見て、「あれ?」と思いませんか? 以前に見たことのあるクラス名(ファイル名)があることに気付くはずです。

Javaのインターフェイスをうまく使う

 Java2WSDLコマンドには多くのオプションがありますが、ここでは必要最低限のオプションだけを利用しています。詳しくはAxisのマニュアルを参照してください。

 (2)のファイル名がWebサービス・プロバイダの作成したJavaBeans「SimpleAddBean.java」と同じファイル名、すなわち同じクラス名になっています。なぜ、Webサービス・クライアントを作るにもかかわらず、サーバ側のJavaBeansと同じクラス名がクライアント側に作成されたのでしょうか? その「?」を探るには、このファイルの中身を見てみると分かってきます。

package SimpleAddService;

public interface SimpleAddBean extends java.rmi.Remote {
    public void add() throws java.rmi.RemoteException;
    public int getInputValue() throws java.rmi.RemoteException;
    public void setInputValue(int in0) throws java.rmi.RemoteException;
    public int getResultValue() throws java.rmi.RemoteException;
    public void setResultValue(int in0) throws java.rmi.RemoteException;
}

 パッケージ名が異なるので、まったく同じものでないことはすぐに分かります。そして次に、このSimpleAddBean.javaは「interface」であることが分かります。Javaのインターフェイスは機能(メソッド)のインターフェイスを定義し、実装を伴いません。すなわち、add()メソッドなどが定義されていますが、単に呼び出すためのメソッドだけが記述されていて、その中にはロジックがありません。Webサービス・プロバイダが作成したJavaBeansと外見は似ていても「実態のあるクラス」とは異なるものであることが分かると思います。

 このインターフェイスをうまく使うことで、Webサービス・リクエスターはWebサービス・クライアントを容易に作ることができるようになります。その作り方は次のセクションで詳しく解説していきましょう。

 気付いた方もいらっしゃるかもしれませんが、これと同様な手法は、ほかのさまざまな技術で見ることができます。代表例としては、Enterprise JavaBeans(EJB)におけるインターフェイスの使われ方です。EJBにおいては、「リモート・インターフェイス」としてまったく同じ形式になっていて、EJBクライアントに同じ使い勝手を提供します。

 筆者の予想では、AxisはEJBクライアントの使い勝手を参考にしているのではないかと思います。というのも、「java.rmi.Remote」を継承したインターフェイスを使っていることからもEJBクライアントと同様の効果を狙っていると思われるからです。

JavaアプリケーションのようにWebサービス・クライアントを作る

 このようにJavaのインターフェイスを使うと、Webサービス・リクエスターは大変容易にWebサービス・クライアントを作ることができるようになります。あたかも、Javaアプリケーションを作っているときと同じようなプログラミングをすることができるようになるのです。

WebサービスリクエスターはJavaアプリケーションのようにクライアントを作成できる WebサービスリクエスターはJavaアプリケーションのようにクライアントを作成できる

 実は、Webサービス・リクエスターにとっては実体(Webサービス側のBean)であろうが、実体のないインターフェイスであろうが、あまり関係ありません。同じようにメソッドを呼び出せて、結果を受け取れればいいのです。これを実現するために、インターフェイスとネットワークの先にある実体のWebサービスをつなげるための「スタブ」としてほかの3つのファイルがあります((1)(3)(4))。このスタブがWebサービス自体がネットワークの先にあるということをWebサービス・リクエスターに意識させないのです。

 このように実体の代理をするインターフェイスを「Proxy」(プロキシ)と呼ぶことがあります。ここでは、これらを利用したクライアントをプロキシ・クライアントと呼ぶことにしましょう。

Webサービス・プロキシ・クライアントを作る

 さて、本当にJavaアプリケーションのようにWebサービス・クライアントを作ることができるのでしょうか? SOAPを意識しないプログラミングになるでしょうか? 早速クライアント・プログラムを作ってみましょう。

 WSDL2Javaコマンドの際に作成されたディレクトリ(SimpleAddService)の中にSimpleAddProxyClient.javaファイルを作成します。

  ●SimpleAddProxyClient.java
package SimpleAddService;

public class SimpleAddProxyClient {
  public static void main(String[] args) {
    try {
    SimpleAddBeanService myService = new SimpleAddBeanServiceLocator();
    SimpleAddBean myBean = myService.getAxisServlet();
    ((AxisServletSoapBindingStub)myBean).setMaintainSession(true);

    myBean.setInputValue(Integer.parseInt(args[0]));
    myBean.add();
    System.out.println( myBean.getResultValue() );

    myBean.setInputValue(Integer.parseInt(args[1]));
    myBean.add();
    System.out.println( myBean.getResultValue() );
    } catch (Exception ex) {
    ex.printStackTrace();
    }
  }
}

 そして、コンパイルコマンドを<@WORK>ディレクトリで実行します。

 >javac SimpleAddService\SimpleAddProxyClient.java

 5つのクラスファイルが生成されていればOKです。

 それでは、Tomcatを起動して早速実行してみましょう。ここでは、Webサービス側のスコープは「session」にしておいてください(第5回参照)。

>java SimpleAddService.SimpleAddProxyClient 2 5
2
7

 前回まで利用してきたWebサービス・クライアントと同じ動作をしていることが分かりますね。このプログラムも立派なWebサービス・クライアントであることが分かると思います。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。