Interstage Studio プログラマーズガイド
目次 索引 前ページ次ページ

第2部 Java編> 第5章 Webサービスアプリケーションを開発する> 5.2 開発の流れ

5.2.2 Webサービスクライアントアプリケーションを作成する

ここでは、Webサービスクライアントアプリケーションを作成する手順について、ワークベンチの使い方を中心に説明します。

Webサービスクライアントアプリケーションを作成する場合には、ビルドパスにInterstage J2EEライブラリを追加する必要があります。
また、WebサービスクライアントアプリケーションをJ2EEアプリケーションクライアントなどのJavaアプリケーションとして動作させる場合には、Interstage J2EEライブラリの追加において"J2EEアプリケーションクライアントからWebサービスを呼び出す"を選択することで、実行確認まで行うことができます。

+Webサービスのインタフェース情報(WSDLファイル)を入手する

Webサービスクライアントを作成するにはWSDLファイルが必要です。

Interstage Application ServerのWebサービスの場合、Interstage管理コンソールのワークユニット > "IJServer名" > [アプリケーション状態/配備解除]タブでWebモジュールを選択して、[Webサービス環境定義]タブよりそのWebサービスの公開用WSDLを取得できます。
Webサービスの開発資産がある場合には、開発資産のWSDLを利用することもできます。

WSDLから生成されるファイルには、WSDLファイルに記述されているlocation情報(接続先のWebサービスのURL)が出力されます。運用環境を変更する場合などのため、アプリケーションを再構築することなく、環境設定で接続先を変更することは可能ですが、利用するWebサービスのlocation情報が記述されているWSDLファイルを使うと手間がかかりません。
Interstage管理コンソールより取得できる公開用WSDLファイルは、取得時に配備先の環境に合わせてWSDLファイルのlocation情報が更新されており、これを使用すると接続先についてユーザが意識する必要はありません。
ただし、Webサービスアプリケーションの開発も同時に行うような場合には、デバッグ環境のlocation情報をWebサービスウィザードで指定しておくことで、配備などの作業を行わずに、開発資産のWSDLファイルをそのまま使うことができ、WebサービスアプリケーションとWebサービスクライアントの開発を平行して行うことができます。
WebサービスクライアントがJ2EEアプリケーションで、サービスインタフェースをJNDIのlookupを利用して取得する場合は、WSDLファイルに記述されているlocation情報を意識する必要はありません。

+Webサービスクライアントウィザードでスタブを生成する

Webサービスクライアントウィザードにより、WSDLファイルからからWebサービスクライアントアプリケーションに必要なファイルを生成することができます。

Webサービスクライアントウィザードを使用するには、Interstage Application Server機能またはInterstage Application Serverクライアントパッケージをインストールしておく必要があります。

Webサービスクライアントウィザードは、以下の手順で起動します。

J2EEパースペクティブから操作する場合:

その他のパースペクティブから操作する場合:

Webサービスクライアントウィザードの詳細については、"Interstage Studioユーザーズガイド"を参照してください。

以下にWebサービスクライアントウィザードで生成されるファイルを示します。

生成ファイル

ファイル名

内容

サービスエンドポイントインタフェース

<WSDLのportType名>.java

利用するWebサービスエンドポイントのインタフェース定義をJavaのインタフェースで記述したものです。

サービスインタフェース

<WSDLのservice名>.java

Webサービスに含まれるWebサービスエンドポイントのスタブを取得するためのインタフェースです。

ユーザ定義型クラス

xxxxx.java

ユーザ固有の型をWebサービスで利用している場合に生成されます。

Holderクラス

xxxxxHolder.java

パラメタがoutやinout型の場合で、ユーザ固有の型や配列など標準のHolderクラスが無い場合に生成されます。

その他のクラス

_isws_ + XXXXX +.java

Webサービスクライアントの実行に必要なクラスです。アプリケーションでこれらのクラスを意識して使用する必要はありません。

ファイル生成時のWSDLのXML型からJava型の変換規則については、"Interstage Application Server J2EEユーザーズガイド"を参照してください。

Webサービスアプリケーションも作成している場合、Webサービスアプリケーション時に作成したサービスエンドポイントインタフェースと、Webサービスクライアント時にWSDLファイルから生成したサービスエンドポイントインタフェースは同一であるとは限りません。そのため、Webサービスクライアントの開発ではWSDLファイルから生成したものを使用してください。

+スタブを利用してWebサービスクライアントを開発する

生成されたスタブなどを利用してWebサービスにアクセスするには、スタブを取得し、スタブのメソッドを呼び出します。

スタブを取得するには、以下の方法があります。

++JNDIを使用してServiceオブジェクトをlookupしたスタブの取得

Webアプリケーション、EJBアプリケーションまたはJ2EEアプリケーションクライアントからWebサービスを呼び出す場合、JNDIを使用してServiceオブジェクトをlookupすることができます。

deployment descriptorの編集

WebサービスクライアントアプリケーションからJNDIを使用してServiceオブジェクトをlookupする場合、クライアントアプリケーションの形態に応じて以下のdeployment descriptorにservice reference記述を定義する必要があります。

クライアントアプリケーションの形態

deployment descriptor

WebアプリケーションからServiceオブジェクトをlookupする場合

web.xml

EJBアプリケーションからServiceオブジェクトをlookupする場合

ejb-jar.xml

J2EEアプリケーションクライアントからServiceオブジェクトをlookupする場合

application-client.xml

[Webアプリケーション(web.xml)での定義例]

<?xml version="1.0" encoding="UTF-8" ?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <display-name>WordServer</display-name>
             ・・・
      <service-ref>
               <description>WSDL Service WebService</description>
               <service-ref-name>service/WordServer</service-ref-name>
               <service-interface>sample.WordServerService</service-interface>
      </service-ref>
</web-app>

<service-ref>タグについては、DDエディタのGUI画面での編集ができないため、[ソース]タブを選択して、XMLを直接追加、更新するか、[Interstage Studioテンプレート]のテンプレートビューからタグを挿入してから値を更新してください。
deployment descriptorのタグの詳細は、"Interstage Application Server J2EEユーザーズガイド"を参照してください。

Serviceオブジェクトを取得してスタブからWebサービスにアクセス

JNDIを使用してServiceオブジェクトを取得して、スタブからWebサービスにアクセスします。

  1. InitialContextオブジェクトを生成する
    InitialContextオブジェクトを新規に生成します。
  2. Serviceオブジェクトを取得する
    取得したInitialContextオブジェクトのlookupメソッドを使用して、Serviceオブジェクトを取得します。
    lookupの引数には、以下の文字列を指定します。
    java:comp/env/[deployment descriptorの<service-ref-name>に指定した値]
  3. スタブオブジェクトを取得する
    取得したServiceオブジェクトのメソッドを使用し、スタブオブジェクト(サービスエンドポイントインタフェースを実装したクラスのインスタンス)を取得します。
  4. スタブオブジェクトのメソッドを呼び出す
    取得したスタブオブジェクトのメソッドを呼び出し、Webサービスにアクセスします。

[JNDIを使用したスタブの取得例]

package sample;

import java.rmi.RemoteException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.holders.StringHolder;

public class WordClient {

    public WordClient() {
    }

    public void run(String[] args) {
        try {
            InitialContext ic = new InitialContext();
            WordServerService service =   (WordServerService)ic.lookup("java:comp/env/service/WordServer");
            WordServer wordServer = service.getWordServerPort();

            String param1 = "Test is OK" ;
            StringHolder param2 = new javax.xml.rpc.holders.StringHolder("") ;
            int wordNumber = wordServer.countWord(param1,param2) ;

            System.out.println("word number " + wordNumber) ;
            System.out.println("words " + param2.value) ;
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        WordClient object = new WordClient();
        object.run(args);
    }

}

JNDIを利用してServiceオブジェクトをlookupする場合は、単一のInitialContextオブジェクトを複数のスレッドで使用することはできません。

J2EEアプリケーションクライアントからJNDIを使用する場合は、JNDIサービスプロバイダの環境設定をする必要があります。JNDIサービスプロバイダの環境設定については、"Interstage Application Server J2EEユーザーズガイド"を参照してください。

++ServiceFactoryを使用したスタブの取得

  1. ServiceFactoryオブジェクトを取得する
    JAX-RPCで提供されているjavax.xml.rpc.ServiceFactoryクラスのnewInstanceメソッドを呼び出し、ServiceFactoryオブジェクトを取得します。
  2. Serviceオブジェクトを取得する
    取得したServiceFactoryオブジェクトのloadService(java.lang.Class)メソッドを使用し、Serviceオブジェクト(サービスインタフェースを実装したクラスのインスタンス)を取得します。
  3. スタブオブジェクトを取得する
    取得したServiceオブジェクトのメソッドを使用し、スタブオブジェクト(サービスエンドポイントインタフェースを実装したクラスのインスタンス)を取得します。
  4. スタブオブジェクトのメソッドを呼び出す
    取得したスタブオブジェクトのメソッドを呼び出し、Webサービスにアクセスします。

[ServiceFactoryを使用したスタブの取得例]

package sample;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.holders.StringHolder;

public class WordClient {

      public WordClient() {
      }

      public void run(String[] args) {
               try {
                         ServiceFactory serviceFactory = ServiceFactory.newInstance();
                         WordServerService service = (WordServerService)serviceFactory.loadService(WordServerService.class);
                         WordServer wordServer = service.getWordServerPort();

                         String param1 = "Test is OK" ;
                         StringHolder param2 = new javax.xml.rpc.holders.StringHolder("") ;
                         int wordNumber = wordServer.countWord(param1,param2) ;

                         System.out.println("word number " + wordNumber) ;
                         System.out.println("words " + param2.value) ;
                } catch (RemoteException e) {
                         e.printStackTrace();
                } catch (ServiceException e) {
                        e.printStackTrace();
                }
       }

       public static void main(String[] args) {
                WordClient object = new WordClient();
                object.run(args);
       }

}

使用するメソッドの詳細は、"Interstage Application Server J2EEユーザーズガイド"およびWebサービス関連のjavadocを参照してください。


目次 索引 前ページ次ページ

Copyright 2007-2008 FUJITSU LIMITED