![]() ![]() ![]() ![]() |
このチュートリアルでは、以下のタイプのクライアント アプリケーションから、「チュートリアル 11 : JWS ファイルのプログラミングによる J2EE 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 のいずれかを省略した場合は、次の手順を実行することで、この前提条件を満たすことができます。
prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
physicianEar
ソース ディレクトリに移動し、ant
コマンドを実行してコンポーネントをコンパイルします。prompt> cd c:\medrec_tutorial\src\physicianEar
prompt> ant
このチュートリアルでは physicianEar
アプリケーションの中の Web サービスのビルド方法を示しますが、physicianEar
の他のコンポーネント (値オブジェクトなど) はすでにコンパイルされていることを前提としています。そのため、この手順は必須です。
medrecEar
ソース ディレクトリに移動します。以下の ant
コマンドを実行して、最初に medrecEar
(このチュートリアルで呼び出す MedRecWebServices
サービスを含む) をビルドし、次にアプリケーションをデプロイします。prompt> cd c:\medrec_tutorial\src\medrecEar
prompt> ant
prompt> ant deploy.medrec.ear
以下の各手順では、さまざまなタイプのクライアント アプリケーションから Web サービスを呼び出すのに必要なコードの抜粋を示します。
この手順では、Physician アプリケーションの PhysicianSessionEJB
から Web サービスを呼び出す方法を説明します。この手順では、clientgen
Ant タスクを実行して必要な Java コードのほとんどを生成する方法を示し、次に Web サービスの呼び出しに使用する PhysicianSessionEJB
の EJB コードについて説明します。
prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
physicianEar
サブディレクトリに移動します。prompt> cd c:\medrec_tutorial\src\physicianEar
my_webserv_client.xml
という名前のファイルを作成します。prompt> notepad my_webserv_client.xml
my_webserv_client.xml
ファイルに次の行を追加します。必要に応じて、c:\medrec_tutorial
を実際の MedRec プロジェクト ディレクトリに置き換えてください。注意: | このビルド ファイルを手動で作成する代わりに、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 ファイルのプログラミングによる J2EE Web サービスの作成」でデプロイした WebLogic Web サービスの WSDL を使用することを指定しています。destdir
属性は、clientgen
がアーティファクトを physicianEar
ビルド ディレクトリの APP-INF/classes
ディレクトリに生成することを指定しています。APP-INF
ディレクトリは WebLogic 分割開発ディレクトリ環境の一部であり、生成されたクラスを、デプロイ済みアプリケーションの他のモジュール (PhysicianSessionEJB
など) から利用できるようにするために使用します。packageName
属性は、Java コードの生成先となるパッケージを指定するために使用します。最後に、classpath
属性では、ユーザ定義のデータ型 (Patient
や Record
など) のコンパイル済みの値クラスが含まれている value.jar JAR
ファイルを指定して、CLASSPATH を更新します。
ただし、このリリースの WebLogic Server では、clientgen
Ant タスクに、ユーザ定義データ型の Java 表現 (言い換えれば、value.jar
ファイルにすでに存在している同じ値クラス) を WSDL ファイル内で生成しないように指示する方法はありません。clientgen
によって生成されるクラスには、MedRec アプリケーションで必要なカスタムの値クラスに追加される、追加のメソッドは含まれていません。したがって、MedRec アプリケーションで不用意に使用されないようにするため、build.xml
に delete
タスクを追加して、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
"
...
my_webserv_client.xml
スクリプトを実行して、clientgen
Ant タスクを実行します。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:
Generating client from http://localhost:7101/ws_medrec/MedRecWebServices?WSDL ...
[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: 7 seconds
PhysicianSessionEJB
を更新して Web サービスを呼び出します。注意: | medrecEar アプリケーションの PhysicianSessionEJB.ejb コードには MedRecWebServices Web サービスの呼び出しに必要なコードがすでに含まれているため、チュートリアルのこの部分では、記述された EJB コードについて簡単に説明します。 |
PhysicianSessionEJB
Java コードを含むディレクトリに移動します。prompt> cd c:\medrec_tutorial\src\physicianEar\physSessionEjbs\com\bea\medrec\controller
PhysicianSessionEJB.ejb
ファイルを開きます。prompt> notepad PhysicianSessionEJB.ejb
getMedRecWebServicesPort()
を探します。このメソッドには、MedRecWebServices
Web サービスの JAX-RPC ポートを作成する標準の Java コード (太字の部分) が含まれています。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 をホストしているコンピュータの名前です。
PhysicianSessionEJB
のパブリック メソッドが、前述の手順で作成した JAX-RPC ポートを使用して Web サービス オペレーションを呼び出します。
たとえば、パブリック メソッド getRecord
を検索してください。メソッドの実装には、前述の手順で作成された port
を使用して MedRecWebServices
Web サービスの getRecord
オペレーションを呼び出す、次のような Java コードが含まれています。
// MedRec からレコードを取得する
recordVO =port.getRecord
(pRecordId.intValue());
PhysicianSessionEJB
をコンパイル、デプロイ、および実行します。
コンパイルの詳細については、「チュートリアル 7 : Ant タスクによる分割開発ディレクトリ アプリケーションのコンパイル」を参照してください。
この手順では、スタンドアロンの Java Swing クライアント アプリケーションから Web サービスを呼び出す方法を説明します。まず、clientgen
Ant タスクを実行して必要な Java コードのほとんどを生成する方法を示し、記述する必要がある実際の Java クライアント コードについて説明します。ここでは、Java Swing クライアント アプリケーションの記述、コンパイル、および実行の方法を理解していることを前提としています。
prompt> c:\bea\user_projects\domains\MedRecDomain\bin\setDomainEnv.cmd
clients
サブディレクトリに移動します。prompt> cd c:\medrec_tutorial\src\clients
my_webserv_client.xml
という名前のファイルを作成します。prompt> notepad my_webserv_client.xml
my_webserv_client.xml
ファイルに次の行を追加します。必要に応じて、c:/medrec_tutorial
を実際の MedRec プロジェクト ディレクトリに置き換えてください。注意: | このビルド ファイルを手動で作成する代わりに、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 ファイルのプログラミングによる J2EE 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
"
...
my_webserv_client.xml
スクリプトを実行して、clientgen
Ant タスクを実行します。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:
Generating client from http://localhost:7101/ws_medrec/MedRecWebServices?WSDL ...
[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: 8 seconds
注意: | MedRec チュートリアル JAR ファイルの Java Swing クライアント アプリケーションには MedRecWebServices Web サービスの呼び出しに必要なコードがすでに含まれているため、チュートリアルのこの部分では、記述された Java コードについて簡単に説明します。 |
prompt> cd c:\medrec_tutorial\src\clients\com\bea\medrec\webservices\swing
EditProfileFrame.java
ファイルを開きます。prompt> notepad EditProfileFrame.java
submitButton_actionPerformed(ActionEvent e)
メソッドを探します。このメソッドには、次の Java コードが含まれています。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 サービス オペレーションを呼び出す方法を示しています。
saveButton_actionPerformed(ActionEvent e)
メソッドを探します。このメソッドは、前述の手順で作成された JAX-RPC スタブ port
の updatePatient
Web サービス オペレーションを呼び出して、更新された患者情報を MedRec アプリケーションに保存します。port.updatePatient(patient);
prompt> cd c:\medrec_tutorial\src\clients
build.xml
ファイルの run
ターゲットを使用して、アプリケーションを実行します。prompt> ant -f build.xml run
アプリケーションで、[Enter Patient SSN] フィールドに 123456789
という社会保障番号を入力して、[Submit] をクリックします。MedRec アプリケーションがデプロイ済みで適切に実行されている場合は、Fred Winner という患者に関する情報が表示されます。
MedRecWebServices
WebLogic Web サービスは、C# で開発された .NET クライアント アプリケーションからも呼び出すことができます。
C# クライアントを作成して実行するには、まずコンピュータに .NET Framework (バージョン 1.1) をインストールする必要があります。「Microsoft .NET Framework Development Center」を参照してください。
次のディレクトリに、MedRecWebServices
WebLogic Web サービスを呼び出すサンプルの C# クライアントがあります。
prompt> c:\medrec_tutorial\src\clients\CSharpClient
クライアントを実行するには、.NET IDE を使用して再ビルドするか、以下のビルド済みアプリケーションを実行します。
prompt> c:\medrec_tutorial\src\clients\CSharpClient\bin\Release\CSharpClient.exe
ビルド済みクライアントは、http://localhost:7011
にデプロイされている MedRecWebService
を呼び出すようにハードコード化されています。したがって、クライアントの [wsdl location] フィールドを、独自の MedRecServer のホストとポート番号で更新してください。
clientgen
Ant タスクを使用して、JAX-RPC スタブなど、必要なクライアントサイド アーティファクトのほとんどを生成します。 clientgen
を使用してクライアント サイドのアーティファクトを生成したら、生成された Java コードをクラス ファイルにコンパイルする必要があります。 APP-INF/classes
ディレクトリにコンパイルして、アプリケーションのすべてのモジュールがそのクラスにアクセスできるようにすることをお勧めします。これは、WebLogic 分割開発ディレクトリ環境を使用していることを前提としています。clientgen
の wsdl
属性を使用して、Web サービスの WSDL またはパブリック コントラクトからクライアント サイドのアーティファクトを生成します。
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 ファイルのプログラミングによる J2EE Web サービスの作成」では、updatePatient
や findPatientBySsn
など、患者情報を検索したり更新したりするオペレーションを含む MedRecWebServices
Web サービス (メインの MedRec アプリケーションの一部) を作成してデプロイする方法を説明しました。この Web サービスのオペレーション、URL、エンドポイントなどを記載した WSDL を介して、パブリック コントラクトがパブリッシュされます。
実際の環境では、Physician アプリケーションはメインの MedRec アプリケーションとは別の WebLogic Server インスタンスにデプロイします。そのため、PhysicianSessionEJB
には、インターネットを介して MedRec アプリケーションと通信する手段が必要です。それには、MedRecWebServices
Web サービスのオペレーションを使用するのが理想的です。clientgen
Ant タスクで生成されたクライアント サイドのアーティファクトには、Web サービス オペレーションの呼び出しに必要な JAX-RPC スタブが含まれます。EJB で実際に記述するときに必要なコードはごく少量です。
スタンドアロンの Java クライアントは、clientgen
で生成されたアーティファクトを使用する限り、基本的には EJB と同じように動作します。
![]() ![]() ![]() |