intra-mart Accel Platform Webサービス Java開発プログラミングガイド 第3版 2017-04-01

Webサービス・クライアント の作成

作成手順の概要

この章では、Web サービスとして公開されたオペレーションを、Javaから利用する手順を説明します。
このサンプルでは、WSDL からスタブクラスを作成し Webサービス・クライアント を実装します。
スタブを利用することにより、XMLを意識することなく、Web サービスを呼び出すことができます。
スタブを利用した Web サービスの呼び出しは、以下の3つの手順で実現できます。
  1. WSDL を指定してスタブクラスを生成します。
  2. Webサービス を呼び出す実行クラスを作成します。
  3. 上記の実行クラスを利用して Web サービスにアクセスします。
このチュートリアルでは、「Webサービス・プロバイダ の作成」で解説されている Web サービスが呼び出されるまでを解説します。

開発環境を用意する

Webサービス・プロバイダ の「開発環境を用意する」と同様に開発環境(e Builder、Resin、および、intra-mart Accel Platform)をインストールします。
このチュートリアルでは、以下のプロジェクトを作成し、開発を行う手順を説明します。
グループID mypackage (デフォルトの設定を使用)
バージョン 1.0.0 (デフォルトの設定を使用)
プロジェクト名 sample_client
e Builder のインストールが完了したら、以下の手順に従って、「Module Project」でプロジェクトを作成します。
  1. 「ファイル」-「新規」-「プロジェクト」をクリックします。
  2. 「e Builder」-「Module Project」を選択して「次へ」をクリックします。
  3. プロジェクト名に「sample_client」を入力して、「終了」をクリックします。
プロジェクトの作成が完了したら、intra-mart Accel Platform の API を使用できるようにするために、プロジェクトの設定を行います。
  1. プロジェクトを右クリックして「プロパティ」を選択します。
  2. 「e Builder」-「Module Assembly」を選択します。
  3. Web アーカイブディレクトリに、war を展開してできたコンテキストパスと同名のフォルダを選択します。
  4. リソース変更時の自動デプロイ先の一覧で、全てのチェックボックスを外します。
  5. 「OK」をクリックします。

依存関係を解決する

プロジェクトの設定が完了したら、依存関係の修正を行います。
Webサービス・プロバイダ にアクセスするためには、「Webサービス 認証・認可クライアント」モジュールに依存する必要があります。
以下の手順に従って、プロジェクトの依存関係を修正します。
  1. 作成したプロジェクトのルートディレクトリに配置されている <module.xml> をダブルクリックします。

  2. 「依存関係」タブを開き、「追加」をクリックします。

  3. 以下の内容を入力して、「OK」をクリックします。

    ID jp.co.intra_mart.im_ws_auth_client
    バージョン 8.0.2

    コラム

    基本的にバージョンはサポートが行われている番号を指定します。
    使用したい API が他のバージョンに含まれている場合、そのバージョン番号を指定してください。
  4. <module.xml> ファイルを保存した後、「module.xml」タブを開き、不要なタグ(<tags>)を除去します。
    最終的なソースは以下です。
    <?xml version="1.0" encoding="UTF-8"?>
    <module conf:schemaLocation="urn:intramart:jackling:toolkit:configurations configurations.xsd"
            xmlns="urn:intramart:jackling:module" xmlns:conf="urn:intramart:jackling:toolkit:configurations"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemeLocation="urn:intramart:jackling:module module.xsd">
    
        <id>mypackage.sample_client</id>
        <version>1.0.0</version>
        <type>module</type>
        <name>${module.name}</name>
        <vendor>${module.vendor}</vendor>
        <description>${module.description}</description>
    
        <dependencies>
            <dependency>
                <module-id>jp.co.intra_mart.im_ws_auth_client</module-id>
                <verified-version min="8.0.2">8.0.2</verified-version>
            </dependency>
        </dependencies>
    </module>
    
  5. 「依存関係の階層」タブを開き、依存関係が解決されさまざまなモジュールが表示されていれば成功です。

スタブクラスを作成する

スタブクラスを作成します。ここではWebサービス用ツールを利用して WSDL からスタブクラスを作成します。
この手順は以下の条件を満たしている環境で行うことを前提とします。
  • Apache Ant がインストールされていること

  • 「Webサービス用ツール」が存在すること

    「Webサービス用ツール」は プロダクトファイルダウンロード より <WebService_Tools.zip> をダウンロードしてください。

    ※ ダウンロードには製品のライセンスキーが必要です。

  • Webサービス・プロバイダ が公開している WSDL が存在すること

Webサービス用ツールを展開したディレクトリを %WEBSERVICE_TOOL_HOME% として以降記述します。

コラム

ビルドツール「Ant」がインストールされていない場合は以下のサイトを参考にしてインストールを行ってください。
  1. スタブを生成するための各種設定を行います。

    1. StubGen.propertiesの編集を行います。

      %WEBSERVICE_TOOL_HOME%/StubGen.propertiesの編集を行います。
      wsdlfilename の値を http://<HOST>:<PORT>/<CONTEXT_PATH>/services/SampleMemberInfoOperatorService?wsdl に設定します。
      <HOST><PORT>、および、<CONTEXT_PATH> については、Webサービス・プロバイダ が起動しているアプリケーションサーバを指すものに変更してください。
      各プロパティの説明は以下の通りです。
      プロパティ名 必須 説明
      wsdlfilename
      WSDL のファイルパス、またはURLを指定します。
      destDir スタブクラスを出力するディレクトリを指定します。
      imartDir
      デプロイされた intra-mart Accel Platform が展開されているディレクトリを指定します。
      この設定はスタブを作成するために必要なライブラリをクラスパス上に展開するために行います。

      例)
      /resin にResinが存在し、imart.war をデプロイし展開済みの場合、imartDir が指定するディレクトリは /resin/webapps/imart を指定します。

      注意

      imartDir に指定するディレクトリは Webサービス 認証・認可 モジュールがデプロイされている必要があります。

      注意

      Windows環境でパスを指定する場合は区切り文字を / または \ としてください。

    2. StubGenを実行するための環境情報を指定します。

      Apache Antがインストールされているディレクトリを指定します。
      %WEBSERVICE_TOOL_HOME%/StubGen.bat(UNIX系OSの場合はStubGeb.sh)を編集します。
      環境変数「ANT_HOME」に対してAntがインストールされているディレクトリを指定します。
      (Windows系OSの場合)
      REM StubGen.bat
      set ANT_HOME=C:/apache-ant
      
      (UNIX系OSの場合)
      # StubGen.sh
      export ANT_HOME=/apache-ant
      
  2. StubGenを実行します。

    同梱されているバッチファイルを実行します。
    (Windows系OSの場合)
    > %WEBSERVICE_TOOL_HOME%\StubGen.bat
    
    (UNIX系OSの場合)
    $ sh %WEBSERVICE_TOOL_HOME%/StubGen.sh
    

    StubGen.propertiesの destDir で指定されているディレクトリの配下にスタブクラス情報が出力されます。

コラム

StubGenは wsdlfilename で指定した WSDL が取得可能な状態で実行してください。

コラム

StubGenを実行すると、destDir に指定したディレクトリ配下に以下のスタブクラス情報が出力されます。

  • stub.jar : スタブのclassファイルが同梱されたjarファイル
  • classes ディレクトリ配下 : スタブのclassファイル
  • src ディレクトリ配下 : スタブのJavaファイル

必要に応じてそれぞれご利用ください。

Webサービス・クライアント を実装する

Webサービス・クライアント を実装します。
スタブクラスを作成する」 で作成したスタブクラス情報をクラスパスに追加します。
  1. e Builder プロジェクトを右クリックして、「ビルド・パス」-「ビルド・パスの構成」を選択します。
  2. スタブクラスを作成する」 で destDir 配下に出力された stub.jar を追加します。
以下の手順に従って、e Builder で Webサービス 実行クラスを作成します。
  1. プロジェクトを右クリックして、「新規」-「クラス」を選択します。

  2. 以下の内容を入力して、「OK」をクリックします。

    パッケージ sample.web_service.client
    名前 MemberInfoOperatorRunner
  3. MemberInfoOperatorRunner.java がプロジェクトの src/main/java 配下に作成されます。

  4. 以下を実装します。

    package sample.web_service.client;
    
    import java.rmi.RemoteException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    import jp.co.intra_mart.foundation.web_service.util.impl.WSAuthDigestGenerator4WSSE;
    
    import org.apache.axis2.AxisFault;
    
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.Add;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.Find;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.FindAll;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.FindAllResponse;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.FindResponse;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.Member;
    import sample.web_service.provider.SampleMemberInfoOperatorServiceStub.WSUserInfo;
    
    /**
     * スタブを利用してSampleMemberInfoOperatorServiceのオペレーションを実行するクライアントクラスのサンプルです。
     */
    public class MemberInfoOperatorRunner {
    
        // ホスト名、ポート番号、コンテキストパスは適宜置き換えてください。
        private static final String ENDPOINT = "http://localhost:8080/imart/services/SampleMemberInfoOperatorService";
    
        private static final String USER_CD = "aoyagi";
    
        private static final String PASSWORD = "aoyagi";
    
        // 実際にはプロバイダから提供された接続先ログイングループID/テナントIDを設定します。
        private static final String LOGIN_GROUP_ID = "default";
    
        public static void main(final String[] args) {
            try {
                new MemberInfoOperatorRunner().add();
            } catch (final RemoteException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * SampleMemberInfoOperatorService#add を実行するサンプルです。<br>
         * 固定的にメンバー情報を追加します。
         */
        public void add() throws RemoteException {
            // Webサービス・オペレーションへのパラメータを作成します。
            final Add parameter = new Add();
            parameter.setWsUserInfo(generateWSUserInfo());
    
            final Member member = new Member();
            member.setId("test");
            member.setName("テストユーザ");
            member.setAge(30);
            member.setMarried(true);
            final Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, 1982);
            cal.set(Calendar.MONTH, Calendar.JUNE);
            cal.set(Calendar.DAY_OF_MONTH, 12);
            member.setBirthDate(cal);
            parameter.setMember(member);
    
            // Webサービスを実行します。
            final SampleMemberInfoOperatorServiceStub client = getStub();
            client.add(parameter);
    
            // 実行結果を標準出力します。
            System.out.println("Success.");
        }
    
        /**
         * SampleMemberInfoOperatorService#find を実行するサンプルです。<br>
         * ID "test" のメンバーを検索し、メンバー情報を標準出力します。
         */
        public void find() throws RemoteException {
            // Webサービス・オペレーションへのパラメータを作成します。
            final Find parameter = new Find();
            parameter.setWsUserInfo(generateWSUserInfo());
            parameter.setId("test");
    
            // Webサービスを実行します。
            final SampleMemberInfoOperatorServiceStub client = getStub();
            final FindResponse response = client.find(parameter);
            final Member member = response.get_return();
    
            // 実行結果を標準出力します。
            printMember(member);
        }
    
        /**
         * SampleMemberInfoOperatorService#findAll を実行するサンプルです。<br>
         * 現在のメンバー情報の数を標準出力します。
         */
        public void findAll() throws RemoteException {
            // Webサービス・オペレーションへのパラメータを作成します。
            final FindAll parameter = new FindAll();
            parameter.setWsUserInfo(generateWSUserInfo());
    
            // Webサービスを実行します。
            final SampleMemberInfoOperatorServiceStub client = getStub();
            final FindAllResponse response = client.findAll(parameter);
            final Member[] members = response.get_return();
    
            // 実行結果を標準出力します。
            if (members == null) {
                System.out.println("Member count : 0");
            } else {
                System.out.println("Member count : " + members.length);
            }
        }
    
        private WSUserInfo generateWSUserInfo() {
            final WSUserInfo info = new WSUserInfo();
            info.setLoginGroupID(LOGIN_GROUP_ID);
            info.setUserID(USER_CD);
            info.setPassword(WSAuthDigestGenerator4WSSE.createWsseAuthString(USER_CD, PASSWORD));
            info.setAuthType(WSAuthDigestGenerator4WSSE.authType);
    
            return info;
        }
    
        private SampleMemberInfoOperatorServiceStub getStub() throws AxisFault {
            final SampleMemberInfoOperatorServiceStub client = new SampleMemberInfoOperatorServiceStub(ENDPOINT);
    
            return client;
        }
    
        private void printMember(final Member member) {
            System.out.println("id       : " + member.getId());
            System.out.println("name     : " + member.getName());
            System.out.println("age      : " + member.getAge());
            System.out.println("married  : " + member.getMarried());
            final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            System.out.println("birthday : " + formatter.format(member.getBirthDate().getTime()));
        }
    
    }
    

コラム

Web サービスのパラメータとして、認証・認可用のユーザ情報を設定します。
このサンプルでは、認証タイプ「WSSE」を利用しています。
認証タイプ「WSSE」の詳細は「Webサービス 認証・認可 仕様書」-「認証・認可」を参照してください。
サンプルでは WSAuthDigestGenerator4WSSE クラスを利用してパスワード・ダイジェストを作成しています。
認証タイプ「WSSE」は、パスワードのダイジェスト化方法に、WS-Security の UsernameToken 形式を採用しています。
WSAuthDigestGenerator4WSSE クラスは、そのパスワード・ダイジェストの生成に特化したユーティリティです。
「ユーザコード」と「パスワード」を元にパスワード・ダイジェストを生成します。
WSAuthDigestGenerator4WSSEの詳細は、「WSAuthDigestGenerator4WSSEのAPIリスト」を参照してください。

コラム

wsUserInfoに設定する情報については、Webサービスプロバイダ側の設定と合わせる必要があります。
サンプルでは「generateWSUserInfo」メソッド内で、wsUserInfoの情報を定義しています。

コラム

Webサービス・プロバイダ がSOAPFaultエラーをスローした場合、スタブを実行した際に AxisFaultが例外としてスローされます。
AxisFaultの詳細は、「Axis2のAPIドキュメント」を参照してください。
なお、Webサービス・プロバイダ 側では、Web サービス呼び出し時に設定した認証情報(WSUserInfo)を元に認証・認可が行われます。
該当するユーザが存在しない、パスワードが間違っているなどの理由でユーザ情報が不正な場合、または、Web サービスを実行する権限がない場合には、AxisFaultが例外としてスローされます。
AxisFaultの getFaultCode メソッドでは、発生した問題に対応するコードが取得できます。
コードについての詳細は「Webサービス 認証・認可 仕様書」-「認証・認可のSOAPフォルト・コード」を参照してください。

Webサービス にアクセスする

e Builder上からJavaアプリケーションとして Webサービス にアクセスします。
  • 以下の手順に従って、メンバ情報を登録します。

    1. プロジェクトの src/main/javasample.web_service.clientMemberInfoOperatorRunner.java を右クリックし、「実行」-「Java アプリケーション」を選択します。

    2. コンソールに以下のよう表示されれば成功です。

      Success.
      

    コラム

    Unsupported major.minor version エラーが発生する場合、Java コンパイラーのバージョンと実行時に利用する jre のバージョンが一致していることを確認してください。

  • 以下の手順に従って、メンバ情報を検索します。

    1. Webサービス・クライアント を実装する」で作成したjavaクラスの main メソッドで実行するメソッドを add から find に変更します。

    2. プロジェクトの src/main/javasample.web_service.clientMemberInfoOperatorRunner.java を右クリックし、「実行」-「Java アプリケーション」を選択します。

    3. コンソールに以下のよう表示されれば成功です。

      id       : test
      name     : テストユーザ
      age      : 30
      barried  : true
      birthday : 1982-06-12
      
  • 以下の手順に従って、メンバ情報の件数を表示します。

    1. Webサービス・クライアント を実装する」で作成したjavaクラスの main メソッドで実行するメソッドを find から findAll に変更します。

    2. プロジェクトの src/main/javasample.web_service.clientMemberInfoOperatorRunner.java を右クリックし、「実行」-「Java アプリケーション」を選択します。

    3. コンソールに以下のよう表示されれば成功です。

      Member count : 1
      

    コラム

    「add」で追加した分のメンバ情報の件数が表示されます。