Avitek Medical Record 開発チュートリアル

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

 


MedRec アプリケーションの開発

 


チュートリアル 12 : クライアント アプリケーションからの Web サービスの呼び出し

このチュートリアルでは、以下のタイプのクライアント アプリケーションから、「チュートリアル 11 : JWS ファイルのプログラミングによる Java EE Web サービスの作成」で作成した MedRecWebServices Web サービス (medrecEar アプリケーション内) を呼び出す方法について説明します。

ステートレス セッション EJB とスタンドアロンの Java クライアントでは、clientgen Ant タスクで生成されたクライアントサイドのアーティファクトを使用して、Web サービスを呼び出します。C# で開発された .NET クライアントを使用して、Java 以外のクライアントからも WebLogic Web サービスを呼び出すことができることを示します。

clientgen WebLogic Web サービス Ant タスクは、クライアント アプリケーションが WebLogic Web サービスと非 WebLogic Web サービスの両方の呼び出しに使用できるクライアント アーティファクトを既存の WSDL ファイルから生成します。以下のようなアーティファクトがあります。

注意 : clientgen Ant タスクを使用して、WebLogic Server とその他のアプリケーション サーバの両方にデプロイされた Web サービスの JAX-RPC スタブを生成できます。

このチュートリアルは、以下の節で構成されています。

 


前提条件

ここでは、セッション EJB、スタンドアロンの Java Swing クライアント アプリケーション、および .NET クライアント アプリケーションを作成する方法を理解しているユーザが、これらを更新して Web サービスを呼び出す方法を学習することを前提としています。

このチュートリアルを開始する前に、チュートリアル 5 ~ 11 を実行して、プロジェクト ディレクトリを作成し、Physician アプリケーションおよび Medrec アプリケーションのビルドの中間手順を実行してください。

チュートリアル 5 ~ 11 のいずれかを省略した場合は、次の手順を実行することで、この前提条件を満たすことができます。

  1. まだ起動していない場合、MedRecServer および Pointbase を起動します。「手順 4 : MedRec 管理サーバを起動する」および「手順 1 : PointBase データベースを起動する」を参照してください。
  2. コマンド ウィンドウを開き、環境を設定します。
  3. prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
  4. ルートの physicianEar ソース ディレクトリに移動し、ant コマンドを実行してコンポーネントをコンパイルします。
  5. prompt> cd c:\medrec_tutorial\src\physicianEar
    prompt> ant

    このチュートリアルでは physicianEar アプリケーションの中の Web サービスのビルド方法を示しますが、physicianEar の他のコンポーネント (値オブジェクトなど) はすでにコンパイルされていることを前提としています。そのため、この手順は必須です。

  6. ルートの medrecEar ソース ディレクトリに移動します。以下の ant コマンドを実行して、最初に medrecEar (このチュートリアルで呼び出す MedRecWebServices サービスを含む) をビルドし、次にアプリケーションをデプロイします。
  7. prompt> cd c:\medrec_tutorial\src\medrecEar
    prompt> ant build.split.dir
    prompt> ant build.ws
    prompt> ant appc.splitdir
    prompt> ant deploy.medrec.ear

 


手順

以下の各手順では、さまざまなタイプのクライアント アプリケーションから Web サービスを呼び出すのに必要なコードの抜粋を示します。

手順 1 : WebLogic Server にデプロイされた EJB から Web サービスを呼び出す

この手順では、Physician アプリケーションの PhysicianSessionEJB から Web サービスを呼び出す方法を説明します。この手順では、clientgen Ant タスクを実行して必要な Java コードのほとんどを生成する方法を示し、次に Web サービスの呼び出しに使用する PhysicianSessionEJB の EJB コードについて説明します。

  1. コマンド ウィンドウを開き、環境を設定します。
  2. prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
  3. MedRec プロジェクト ディレクトリ内の physicianEar サブディレクトリに移動します。
  4. prompt> cd c:\medrec_tutorial\src\physicianEar
  5. テキスト エディタを使用して my_webserv_client.xml という名前のファイルを作成します。
  6. prompt> notepad my_webserv_client.xml
  7. my_webserv_client.xml ファイルに次の行を追加します。必要に応じて、c:\medrec_tutorial を実際の MedRec プロジェクト ディレクトリに置き換えてください。
  8. 注意 : このビルド ファイルを手動で作成する代わりに、ws_ejb_client_tutorial.xml ファイルの内容を新しい my_webserv_client.xml ファイルにコピーすることもできます。その上で、以降の手順でこのファイルの内容を理解してください。ws_ejb_client_tutorial.xml ファイルは、MedRec プロジェクト ディレクトリが c:\medrec_tutorial であることを前提としています。
    <project name="EJB Web Service Invoke" default="build.ws.client">
      <taskdef name="clientgen"
    classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
      <target name="build.ws.client">
        <clientgen
    wsdl="http://localhost:7101/ws_medrec/MedRecWebServices?WSDL"
    destDir="c:/medrec_tutorial/build/physicianEar/APP-INF/classes"
    packageName="com.bea.medrec.webservices.client"
    classpath="${java.class.path};c:/medrec_tutorial/build/physicianEar/APP-INF/lib/value.jar"/>
        <delete includeEmptyDirs="true" failonerror="false" quiet="false">
    <fileset dir="c:/medrec_tutorial/build/physicianEar/APP-INF/classes/com/bea/medrec/value"/>
    </delete>
        <javac
    srcdir="c:/medrec_tutorial/build/physicianEar/APP-INF/classes/com"
    includes="**/*.java"
    classpath="${java.class.path};c:/medrec_tutorial/build/physicianEar/APP-INF/lib/value.jar;c:/medrec_tutorial/build/physicianEar/APP-INF/classes"/>
      </target>
    </project>

    この Ant ビルド ファイルの冒頭には、taskdef タスクを使用して clientgen Ant タスクの完全なクラス名を指定する方法が示されています。

    次に、Web サービスの呼び出しに必要なクライアントサイドのアーティファクトを生成する clientgen Web サービス Ant タスクを呼び出します。wsdl 属性では、clientgen Ant タスクが、アーティファクトを生成するときに、「チュートリアル 11 : JWS ファイルのプログラミングによる Java EE Web サービスの作成」でデプロイした WebLogic Web サービスの WSDL を使用することを指定しています。destdir 属性は、clientgen がアーティファクトを physicianEar ビルド ディレクトリの APP-INF/classes ディレクトリに生成することを指定しています。APP-INF ディレクトリは WebLogic 分割開発ディレクトリ環境の一部であり、生成されたクラスを、デプロイ済みアプリケーションの他のモジュール (PhysicianSessionEJB など) から利用できるようにするために使用します。packageName 属性は、Java コードの生成先となるパッケージを指定するために使用します。最後に、classpath 属性では、ユーザ定義のデータ型 (PatientRecord など) のコンパイル済みの値クラスが含まれている value.jar JAR ファイルを指定して、CLASSPATH を更新します。

    ただし、このリリースの WebLogic Server では、clientgen Ant タスクに、ユーザ定義データ型の Java 表現 (言い換えれば、value.jar ファイルにすでに存在している同じ値クラス) を WSDL ファイル内で生成しないように指示する方法はありません。clientgen によって生成されるクラスには、MedRec アプリケーションで必要なカスタムの値クラスに追加される、追加のメソッドは含まれていません。したがって、MedRec アプリケーションで不用意に使用されないようにするため、build.xmldelete タスクを追加して、clientgen で生成されたクラスを削除する必要があります。

    clientgen はコンパイルされていない Java クラスを生成するので、ビルド ファイルでは、次に javac タスクを呼び出して、生成されたすべてのコードをコンパイルします。

    注意 : 前述の Ant ビルド ファイルは、MedRecWebServices WebLogic Web サービスを WebLogic Server にデプロイ済みで、その WSDL にアクセス可能であることを前提としています。これは clientgen Ant タスクを実行する一般的な方法です。ただし、Web サービスをまだデプロイしていない場合は、wsdl 属性で静的な WSDL ファイル (特に、MedRecWebServices サービスを含む medrecEar アプリケーションをコンパイルしたときに生成された WSDL ファイル) を指定できます。静的な WSDL ファイルを使用するには、my_webserv_client.xml で、clientgen タスクの wsdl 属性を次のように更新します。
        <clientgen
    wsdl="c:/medrec_tutorial/build/medrecEar/MedRecWebServices/WEB-INF/MedRecWebServices.wsdl"
    ...
  9. my_webserv_client.xml スクリプトを実行して、clientgen Ant タスクを実行します。
  10. prompt> ant -f my_webserv_client.xml

    clientgen Ant タスクにより、以下のような出力が表示されます。

    Buildfile: my_webserv_client.xml
    Trying to override old definition of task clientgen
    build.ws.client:
    [clientgen]
    [clientgen] *********** jax-rpc clientgen attribute settings ***************
    [clientgen]
    [clientgen] wsdlURI: http://localhost:7101/ws_medrec/MedRecWebServices?WSDL
    [clientgen] serviceName : null
    [clientgen] packageName : com.bea.medrec.webservices.client
    [clientgen] destDir : C:\medrec_tutorial\build\physicianEar\APP-INF\classes
    [clientgen] handlerChainFile : null
    [clientgen] generatePolicyMethods : false
    [clientgen] autoDetectWrapped : true
    [clientgen] jaxRPCWrappedArrayStyle : true
    [clientgen] generateAsyncMethods : true
    [clientgen]
    [clientgen] *********** jax-rpc clientgen attribute settings end ***************
    [clientgen] Package name is com.bea.medrec.webservices.client
    [clientgen] DestDir is C:\medrec_tutorial\build\physicianEar\APP-INF\classes
    [clientgen] class name is MedRecWebServicesPortType_Stub
    [clientgen] service class name is MedRecWebServices
    [clientgen] Porttype name is MedRecWebServicesPortType
    [clientgen] service impl name is MedRecWebServices_Impl
    [delete] Deleting 8 files from C:\medrec_tutorial\build\physicianEar\APP-INF\classes\com\bea\medrec\value
    [delete] Deleted 1 directory from C:\medrec_tutorial\build\physicianEar\APP-INF\classes\com\bea\medrec\value
    [javac] Compiling 5 source files
    [javac] Note: C:\medrec_tutorial\build\physicianEar\APP-INF\classes\com\bea\medrec\webservices\client\MedRecWebServicesPortType_Stub.java uses unchecked orunsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    BUILD SUCCESSFUL
    Total time: 10 seconds
  11. PhysicianSessionEJB を更新して Web サービスを呼び出します。
  12. 注意 : medrecEar アプリケーションの PhysicianSessionEJB.ejb コードには MedRecWebServices Web サービスの呼び出しに必要なコードがすでに含まれているため、チュートリアルのこの部分では、記述された EJB コードについて簡単に説明します。
    1. PhysicianSessionEJB Java コードを含むディレクトリに移動します。
    2. prompt> cd c:\medrec_tutorial\src\physicianEar\physSessionEjbs\com\bea\medrec\controller
    3. IDE またはテキスト エディタで PhysicianSessionEJB.ejb ファイルを開きます。
    4. prompt> notepad PhysicianSessionEJB.ejb
    5. プライベート メソッド getMedRecWebServicesPort() を探します。このメソッドには、MedRecWebServices Web サービスの JAX-RPC ポートを作成する標準の Java コード (太字の部分) が含まれています。
    6. wsUrl = (String) initCtx.lookup("java:comp/env/webservice/url");
      wsUsername = (String) initCtx.lookup("java:comp/env/webservice/username");
      wsPassword = (String) initCtx.lookup("java:comp/env/webservice/password");
      logger.debug("MedRec Web Service URL: " + wsUrl);
      MedRecWebServices service = new MedRecWebServices_Impl(wsUrl+"?WSDL");
      port = service.getMedRecWebServicesPort(wsUsername, wsPassword);

      PhysicianSessionEJB.ejb ファイルの先頭で @EnvEntries EJBGen アノテーションを使用して、デプロイされた MedRecWebServices の WSDL の URL と、Web サービスを呼び出すユーザのユーザ名およびパスワードが定義されています。実際の URL は次のとおりです。

      http://host:7101/ws_medrec/MedRecWebServices?WSDL

      host は MedRec をホストしているコンピュータの名前です。

    7. PhysicianSessionEJB のパブリック メソッドが、前述の手順で作成した JAX-RPC ポートを使用して Web サービス オペレーションを呼び出します。
    8. たとえば、パブリック メソッド getRecord を検索してください。メソッドの実装には、前述の手順で作成された port を使用して MedRecWebServices Web サービスの getRecord オペレーションを呼び出す、次のような Java コードが含まれています。

       // MedRec からレコードを取得する
      recordVO = port.getRecord(pRecordId.intValue());
  13. 通常どおりに PhysicianSessionEJB をコンパイル、デプロイ、および実行します。
  14. コンパイルの詳細については、「チュートリアル 7 : Ant タスクによる分割開発ディレクトリ アプリケーションのコンパイル」を参照してください。

手順 2 : スタンドアロンの Java Swing クライアント アプリケーションから Web サービスを呼び出す

この手順では、スタンドアロンの Java Swing クライアント アプリケーションから Web サービスを呼び出す方法を説明します。まず、clientgen Ant タスクを実行して必要な Java コードのほとんどを生成する方法を示し、記述する必要がある実際の Java クライアント コードについて説明します。ここでは、Java Swing クライアント アプリケーションの記述、コンパイル、および実行の方法を理解していることを前提としています。

  1. コマンド ウィンドウを開き、環境を設定します。
  2. prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
  3. MedRec プロジェクト ディレクトリ内の clients サブディレクトリに移動します。
  4. prompt> cd c:\medrec_tutorial\src\clients
  5. テキスト エディタを使用して my_webserv_client.xml という名前のファイルを作成します。
  6. prompt> notepad my_webserv_client.xml
  7. my_webserv_client.xml ファイルに次の行を追加します。必要に応じて、c:/medrec_tutorial を実際の MedRec プロジェクト ディレクトリに置き換えてください。
  8. 注意 : このビルド ファイルを手動で作成する代わりに、ws_standalone_client_tutorial.xml ファイルの内容を新しい my_webserv_client.xml ファイルにコピーすることもできます。その上で、以降の手順でこのファイルの内容を理解してください。MedRec プロジェクト ディレクトリが c:/medrec_tutorial であることを前提としています。
    <project name="Standalone Web Service Invoke" default="build.ws.client" >
     <taskdef name="clientgen"
    classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
      <target name="build.ws.client">
        <clientgen
    wsdl="http://localhost:7101/ws_medrec/MedRecWebServices?WSDL"
    destDir="c:/medrec_tutorial/build/swing_client/clientgen"
    packageName="com.bea.medrec.webservices"/>
        <javac
    srcdir="c:/medrec_tutorial/build/swing_client/clientgen"
    destdir="c:/medrec_tutorial/build/swing_client/wsclient"
    includes="**/*.java"/>
        <javac
    srcdir="com"
    destdir="c:/medrec_tutorial/build/swing_client/wsclient"
    includes="**/*.java"
    classpath="${java.class.path};c:/medrec_tutorial/build/swing_client/wsclient" />
      </target>
    </project>

    この Ant ビルド ファイルでは、最初に taskdef タスクを使用して、clientgen Ant タスクの完全なクラス名を指定しています。

    次に、Web サービスの呼び出しに必要なクライアントサイドのアーティファクトを生成する clientgen Web サービス Ant タスクを呼び出します。wsdl 属性では、clientgen Ant タスクが、アーティファクトを生成するときに、「チュートリアル 11 : JWS ファイルのプログラミングによる Java EE Web サービスの作成」でデプロイした WebLogic Web サービスの WSDL を使用することを指定しています。 destdir 属性では、clientgen がアーティファクトを c:/medrec_tutorial/build/swing_client/clientgen ディレクトリに生成することを指定しています。packageName 属性では、Java コードの生成先となるパッケージを指定します。

    clientgen はコンパイルされていない Java クラスを生成するので、ビルド ファイルでは、次に javac タスクを呼び出して、生成されたすべてのコードをコンパイルします。2 番目の javac タスクは、Swing クライアントそのもの (ソース コードの場所は c:\medrec_tutorial\src\clients\com) を、clientgen で生成された Java コードのコンパイル先と同じディレクトリにコンパイルします。

    注意 : 前述の Ant ビルド ファイルは、MedRecWebServices WebLogic Web サービスを WebLogic Server にデプロイ済みで、その WSDL にアクセス可能であることを前提としています。これは clientgen Ant タスクを実行する一般的な方法です。ただし、Web サービスをまだデプロイしていない場合は、wsdl 属性で静的な WSDL ファイル (特に、MedRecWebServices サービスを含む medrecEar アプリケーションをコンパイルしたときに生成された WSDL ファイル) を指定できます。静的な WSDL ファイルを使用するには、my_webserv_client.xml で、clientgen タスクの wsdl 属性を次のように更新します。
        <clientgen
    wsdl="c:/medrec_tutorial/build/medrecEar/MedRecWebServices/WEB-INF/MedRecWebServices.wsdl"
    ...
  9. my_webserv_client.xml スクリプトを実行して、clientgen Ant タスクを実行します。
  10. prompt> ant -f my_webserv_client.xml

    clientgen Ant タスクにより、以下の出力が表示されます。

    Buildfile: my_webserv_client.xml
    Trying to override old definition of task clientgen
    build.ws.client:
    [clientgen]
    [clientgen] *********** jax-rpc clientgen attribute settings ***************
    [clientgen]
    [clientgen] wsdlURI: http://localhost:7101/ws_medrec/MedRecWebServices?WSDL
    [clientgen] serviceName : null
    [clientgen] packageName : com.bea.medrec.webservices
    [clientgen] destDir : C:\medrec_tutorial\build\swing_client\clientgen
    [clientgen] handlerChainFile : null
    [clientgen] generatePolicyMethods : false
    [clientgen] autoDetectWrapped : true
    [clientgen] jaxRPCWrappedArrayStyle : true
    [clientgen] generateAsyncMethods : true
    [clientgen]
    [clientgen] *********** jax-rpc clientgen attribute settings end ***************
    [clientgen] Package name is com.bea.medrec.webservices
    [clientgen] DestDir is C:\medrec_tutorial\build\swing_client\clientgen
    [clientgen] class name is MedRecWebServicesPortType_Stub
    [clientgen] service class name is MedRecWebServices
    [clientgen] Porttype name is MedRecWebServicesPortType
    [clientgen] service impl name is MedRecWebServices_Impl
    [javac] Compiling 13 source files to C:\medrec_tutorial\build\swing_client\wsclient
    [javac] Note: C:\medrec_tutorial\build\swing_client\clientgen\com\bea\medrec\webservices\MedRecWebServicesPortType_Stub.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] Compiling 4 source files to C:\medrec_tutorial\build\swing_client\wsclient
    BUILD SUCCESSFUL
    Total time: 14 seconds
  11. スタンドアロンの Java Swing クライアント アプリケーションを更新して Web サービスを呼び出します。
  12. 注意 : MedRec チュートリアル JAR ファイルの Java Swing クライアント アプリケーションには MedRecWebServices Web サービスの呼び出しに必要なコードがすでに含まれているため、チュートリアルのこの部分では、記述された Java コードについて簡単に説明します。
    1. Java Swing クライアント アプリケーション コードを含むディレクトリに移動します。
    2. prompt> cd c:\medrec_tutorial\src\clients\com\bea\medrec\webservices\swing
    3. IDE またはテキスト エディタで EditProfileFrame.java ファイルを開きます。
    4. prompt> notepad EditProfileFrame.java
    5. アプリケーションのユーザが [Submit] をクリックしたときに患者の社会保障番号に基づいて患者情報を返す submitButton_actionPerformed(ActionEvent e) メソッドを探します。このメソッドには、次の Java コードが含まれています。
    6. MedRecWebServices ws =
      new MedRecWebServices_Impl(this.WSDLTextField.getText());
      MedRecWebServicesPortType port  = ws.getMedRecWebServicesPort();
      Patient Patient =
      (Patient)port.findPatientBySsn(this.patientIDTextField.getText());

      このコードは、アプリケーションの WSDLTextField の WSDL から MedRecWebServices Web サービスの JAX-RPC スタブを作成し、次に findPatientBySsn Web サービス オペレーションを呼び出す方法を示しています。

    7. saveButton_actionPerformed(ActionEvent e) メソッドを探します。このメソッドは、前述の手順で作成された JAX-RPC スタブ portupdatePatient Web サービス オペレーションを呼び出して、更新された患者情報を MedRec アプリケーションに保存します。
    8. port.updatePatient(patient);
  13. クライアント アプリケーションのメイン ソース ディレクトリへ移動します。
  14. prompt> cd c:\medrec_tutorial\src\clients
  15. 既存の build.xml ファイルの run ターゲットを使用して、アプリケーションを実行します。
  16. prompt> ant -f build.xml run

    アプリケーションで、[Enter Patient SSN] フィールドに 123456789 という社会保障番号を入力して、[Submit] をクリックします。MedRec アプリケーションがデプロイ済みで適切に実行されている場合は、Fred Winner という患者に関する情報が表示されます。

手順 3 : .NET クライアントから Web サービスを呼び出す

MedRecWebServices WebLogic Web サービスは、C# で開発された .NET クライアント アプリケーションからも呼び出すことができます。

C# クライアントを作成して実行するには、まずコンピュータに .NET Framework (バージョン 1.1) をインストールする必要があります。「Microsoft .NET Framework Development Center」を参照してください。

次のディレクトリに、MedRecWebServices WebLogic Web サービスを呼び出すサンプルの C# クライアントがあります。

prompt> cd c:\medrec_tutorial\src\clients\CSharpClient

クライアントを実行するには、.NET IDE を使用して再ビルドするか、以下のビルド済みアプリケーションを実行します。

prompt> c:\medrec_tutorial\src\clients\CSharpClient\bin\Release\CSharpClient.exe

アプリケーションで、[Enter Patient SSN] フィールドに 123456789 という社会保障番号を入力して、[Submit] をクリックします。MedRec アプリケーションがデプロイ済みで適切に実行されている場合は、Fred Winner という患者に関する情報が表示されます。

警告 : ビルド済みクライアントは、http://localhost:7011 にデプロイされている MedRecWebService を呼び出すようにハードコード化されています。したがって、クライアントの [wsdl location] フィールドを、独自の MedRecServer のホストとポート番号で更新してください (デフォルトでは http://localhost:7101)。

 


ベスト プラクティス

 


全体像

Web サービスを呼び出すクライアント アプリケーションは、Java、Microsoft SOAP Toolkit、Microsoft .NET などの任意のテクノロジを使用して記述できます。Java クライアント アプリケーションでは XML ベースの RPC (JAX-RPC) の Java API を使用します。この JAX-RPC は Sun Microsystems の仕様で、Web サービスを呼び出す Java クライアント API を定義します。WebLogic Server にデプロイされた EJB やスタンドアロンの Java クライアントが、Java クライアント アプリケーションに該当します。

チュートリアル 11 : JWS ファイルのプログラミングによる Java EE Web サービスの作成」では、updatePatientfindPatientBySsn など、患者情報を検索したり更新したりするオペレーションを含む MedRecWebServices Web サービス (メインの MedRec アプリケーションの一部) を作成してデプロイする方法を説明しました。この Web サービスのオペレーション、URL、エンドポイントなどを記載した WSDL を介して、パブリック コントラクトがパブリッシュされます。

実際の環境では、Physician アプリケーションはメインの MedRec アプリケーションとは別の WebLogic Server インスタンスにデプロイします。そのため、PhysicianSessionEJB には、インターネットを介して MedRec アプリケーションと通信する手段が必要です。それには、MedRecWebServices Web サービスのオペレーションを使用するのが理想的です。clientgen Ant タスクで生成されたクライアントサイドのアーティファクトには、Web サービス オペレーションの呼び出しに必要な JAX-RPC スタブが含まれます。EJB で実際に記述するときに必要なコードはごく少量です。

スタンドアロンの Java クライアントは、clientgen で生成されたアーティファクトを使用する限り、基本的には EJB と同じように動作します。

 


関連情報


ページの先頭       前  次