![]() ![]() ![]() ![]() |
この章では、WebLogic Web サービスを呼び出す方法について説明します。
注意 : | 以下の節では、メッセージ保護された Web サービスの呼び出しについては説明していません。メッセージ保護された Web サービスの呼び出しについては、メッセージ セキュリティの節、「クライアント アプリケーションの更新によるメッセージ保護された Web サービスの呼び出し」を参照してください。 |
Web サービスの呼び出しは、クライアント アプリケーションが Web サービスを使用するために実行するアクションです。Web サービスを呼び出すクライアント アプリケーションは、Java、Microsoft .NET などの任意のテクノロジを使用して記述できます。
注意 : | ここで説明する「クライアント アプリケーション」としては、2 種類のクライアントが考えられます。1 つはスタンドアロン クライアントで、WebLogic クライアント クラスを使用して WebLogic Server 上または他のアプリケーション サーバ上でホストされる Web サービスを呼び出します。このマニュアルでいう「スタンドアロン クライアント」とは、WebLogic Server から独立した実行時環境を持つクライアントのことを指します。Web サービスを呼び出すもう 1 種類のクライアント アプリケーションは、EJB や他の Web サービスなど、WebLogic Server にデプロイされている J2EE コンポーネント内で実行されるものです。 |
以降の節では、JAX-RPC 仕様 (バージョン 1.1) の BEA の実装を使用して Java クライアント アプリケーションから Web サービスを呼び出す方法について説明します。この実装を使用することで、WebLogic および非 WebLogic にかかわらず任意のアプリケーション サーバで実行されている Web サービスを呼び出すことができます。さらには、スタンドアロン クライアント アプリケーションまたは WebLogic Server の一部として実行されるクライアント アプリケーションのどちらも作成できます。
警告 : | ユーザ定義のデータ型をパラメータまたは戻り値として実装する Web サービス オペレーションを、動的クライアントを使用して呼び出すことはできません。動的クライアントでは、JAX-RPC の Call インタフェースを使用するためです。標準の (静的) クライアントでは、JAX-RPC の Service インタフェースおよび Stub インタフェースを使用するため、ユーザ定義のデータ型を実装する Web サービスを正常に呼び出すことができます。 |
この節では、以下の 2 種類のクライアント アプリケーションについて説明します。
Java API for XML based RPC (JAX-RPC) は、Web サービスの呼び出しに使用する API を定義する Sun Microsystems の仕様です。WebLogic Server には、JAX-RPC 1.1 仕様の実装が組み込まれています。
次の表で、JAX-RPC の中心的なインタフェースとクラスを簡単に説明します。
JAX-RPC の詳細については、http://java.sun.com/xml/jaxrpc/index.html を参照してください。
clientgen
WebLogic Web サービス Ant タスクは、クライアント アプリケーションが WebLogic Web サービスと非 WebLogic Web サービスの両方の呼び出しに使用できるクライアント アーティファクトを既存の WSDL ファイルから生成します。以下のようなアーティファクトがあります。
clientgen
Ant タスクの詳細 (使用可能なすべての属性など) については、「Ant タスク リファレンス」を参照してください。
警告 : | このリリースの WebLogic Server でサポートされている clientgen Ant タスクの完全修飾名は、weblogic.wsee.tools.anttasks.ClientGenTask です。これは、WebLogic Server バージョン 8.1 でサポートされている clientgen Ant タスクの完全修飾名 (weblogic.webservice.clientgen ) とは異なります。 |
警告 : | 8.1 の clientgen Ant タスクはこのリリースの WebLogic Server でもサポートされていますが、これは非推奨です。9.X WebLogic Web サービスを呼び出すクライアント アーティファクトを生成したい場合は、8.1 バージョンではなく 9.X バージョンの clientgen を使用するようにしてください。たとえば、8.1 Web サービスを 9.2 にアップグレードしたにもかかわらず、Ant スクリプトで完全修飾名を使用しているため、8.1 clientgen Ant タスクが明示的に呼び出されるようになっている場合は、それらの Ant スクリプトを変更して 9.X clientgen が呼び出されるようにする必要があります。 |
WebLogic Server の WL_HOME/samples/server/examples/src/examples/webservices
ディレクトリには、WebLogic Web サービスの作成と呼び出しのサンプルがあります。WL_HOME
は、WebLogic Server のメイン ディレクトリです。
サンプルのビルドおよび実行方法の詳細については、ブラウザで Web ページ WL_HOME
/samples/server/docs/index.html
を開いて [WebLogic Server Examples|Examples|API|Web Services] ノードを展開してください。
以下の手順では、開発環境でのクライアント アプリケーションのビルドや Java ファイルのコンパイルなどに Ant を使用することを前提としています。また、Web サービスのクライアント タスクで更新する必要のある build.xml
ファイルが、すでにあることを想定しています。
開発環境での Ant の使用については、「基本的な Ant build.xml ファイルの作成」を参照してください。この節で使用する build.xml
ファイルのサンプルの全体については、「スタンドアロン Java クライアントのサンプル Ant ビルド ファイル」を参照してください。
Web サービスを呼び出す Java スタンドアロン クライアント アプリケーションを作成するには、次の手順に従います。
Windows NT では、ドメイン ディレクトリにある setDomainEnv.cmd
コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME
\user_projects\domains\
domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリで、domainName
はドメインの名前です。
UNIX では、ドメイン ディレクトリにある setDomainEnv.sh
コマンドを実行します。WebLogic Server ドメインのデフォルトの場所は、BEA_HOME
/user_projects/domains/
domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリ、domainName
はドメインの名前です。
build.xml
ファイルを更新して、Web サービスの呼び出しに必要なクライアントサイド アーティファクトを生成する clientgen
Ant タスクが実行されるようにします。
「クライアントのアーティファクトを生成するための clientgen Ant タスクの使用」を参照してください。
「Web サービスに関する情報の取得」を参照してください。
「Web サービスを呼び出す Java クライアント アプリケーション コードの記述」を参照してください。
「クライアント アプリケーションのコンパイルと実行」を参照してください。
次のサンプルのように、build.xml
ファイルを更新して clientgen
Ant タスクに呼び出しを追加します。
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="clientclasses"
packageName="examples.webservices.simple_client"/>
</target>
clientgen
WebLogic Web サービス Ant タスクを実行するには、その前にこのタスクの完全な Java クラス名を標準の taskdef
Ant タスクを使用して指定する必要があります。
クライアントサイド アーティファクトの作成に使用する WSDL ファイルと、そうしたアーティファクトの生成先ディレクトリを指定するには、clientgen
Ant タスクの wsdl
属性と destDir
属性を含める必要があります。packageName
属性は省略できます。省略した場合は、WSDL の targetNamespace
に基づくパッケージ名が使用されます。
注意 : | clientgen Ant タスクの destFile 属性を使用すると、生成された Java ファイルを自動的にコンパイルして、すべてのアーティファクトを JAR ファイルにパッケージ化できます。コンパイルの詳細については、「clientgen」を参照してください。 |
WSDL ファイルで、Web サービス オペレーションの入力パラメータまたは戻り値としてユーザ定義のデータ型が指定されている場合、clientgen
は WSDL に定義された XML スキーマ データ型の Java 表現である JavaBean クラスを自動的に生成します。JavaBean クラスは、destDir
ディレクトリに生成されます。
注意 : | ユーザ定義の Java データ型のパッケージは、WSDL のデータ型の XML スキーマに基づくもので、JAX-RPC スタブのパッケージ名とは異なります。 |
この手順で説明されている追加のターゲット (clean
など) を含む、完全なサンプル build.xml
ファイルについては、「スタンドアロン Java クライアントのサンプル Ant ビルド ファイル」を参照してください。
clientgen
Ant タスクを他のサポート Ant タスクと一緒に実行するには、コマンドラインで build-client
ターゲットを指定します。
prompt> ant build-client
clientclasses
ディレクトリで、clientgen
Ant タスクによって生成されたファイルやアーティファクトを確認します。
オペレーションを呼び出す Java クライアント アプリケーション コードの記述に先立って、Web サービスの名前とオペレーションのシグネチャを知る必要があります。Web サービスに関する情報を調べるにはさまざまな方法があります。
一番良いのは、clientgen
Ant タスクを使用して Web サービス固有の JAX-RPC スタブを生成し、生成された *.java
ファイルを調べる方法です。*.java ファイルは、destDir
属性で指定したディレクトリ内の packageName
属性の値に対応したサブディレクトリに生成されます。packageName 属性が指定されていない場合、WSDL の targetNamespace
に基づくパッケージに対応したサブディレクトリに生成されます。
ServiceName
.java
ソース ファイルには、Web サービスのポートを取得するための get
PortName
()
メソッドが含まれています。ここで、ServiceName
は Web サービス名、PortName
はポート名です。Web サービスが JWS ファイルで実装されている場合、Web サービス名は @WebService
JWS アノテーションの serviceName
属性の値となり、ポート名は @WLHttpTransport
アノテーションの portName
属性の値となります。PortType
.java
ファイルには、Web サービスのパブリック オペレーションに対応するメソッド シグネチャが含まれます。ここで PortType
は、Web サービスのポートの種類です。Web サービスが JWS ファイルで実装されている場合、ポートの種類は @WebService
JWS アノテーションの name
属性の値となります。
Web サービスの実際の WSDL を調べることもできます。デプロイされている WebLogic Web サービスの WSDL の詳細については、「Web サービスの WSDL の参照」を参照してください。Web サービス名は、次の TraderService
WSDL の抜粋に示すように、<service>
要素内にあります。
<service name="TraderService">
<port name="TraderServicePort"
binding="tns:TraderServiceSoapBinding">
...
</port>
</service>
この Web サービス用に定義されているオペレーションは、対応する <binding>
要素の下に記述されています。たとえば次の WSDL の抜粋は、TraderService
Web サービスに buy
と sell
の 2 つのオペレーションがあることを示しています (わかりやすくするため、WSDL の関連部分のみを記載しています)。
<binding name="TraderServiceSoapBinding" ...>
...
<operation name="sell">
...
</operation>
<operation name="buy">
</operation>
</binding>
次のコード例では、スタンドアロン アプリケーションが Web サービス オペレーションを呼び出しています。
このクライアント アプリケーションは 1 つの引数 (Web サービスの WSDL) を取ります。アプリケーションは、標準 JAX-RPC API コードと、clientgen
によって生成された Service
インタフェースの Web サービス固有の実装を使用して、Web サービスのオペレーションを呼び出します。
このサンプルでは、ユーザ定義のデータ型 (examples.webservices.complex.BasicStruct) を入力パラメータおよび戻り値として使用するオペレーションを呼び出す方法も示します。clientgen
Ant タスクによって、このユーザ定義のデータ型の Java コードが自動的に生成されます。
package examples.webservices.simple_client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
// echoComplexType オペレーションのパラメータおよび戻り値として使用される
// BasicStruct クラスをインポートする。// このクラスは clientgen Ant タスクによって自動的に生成される
import examples.webservices.complex.BasicStruct;
/**
* ComplexService Web サービスの echoComplexType オペレーションを呼び出す
* 簡単なスタンドアロンのクライアント アプリケーション
*
* @author Copyright (c) 2005 by BEA Systems. All Rights Reserved.
*/
public class Main {
public static void main(String[] args)
throws ServiceException, RemoteException{
ComplexService service = new ComplexService_Impl (args[0] + "?WSDL" );
ComplexPortType port = service.getComplexServicePort();
BasicStruct in = new BasicStruct();
in.setIntValue(999);
in.setStringValue("Hello Struct");
BasicStruct result = port.echoComplexType(in);
System.out.println("echoComplexType called. Result: " + result.getIntValue() + ", " + result.getStringValue());
}
}
ComplexPortType
スタブを作成する方法を示す。ComplexService service = new ComplexService_Impl (args[0] + "?WSDL");
ComplexPortType port = service.getComplexServicePort();
ComplexService_Impl
スタブ ファクトリは JAX-RPC の Service
インタフェースを実装します。ComplexService_Impl
のコンストラクタは、指定されている WSDL URI (args[0] + "?WSDL"
) に基づいてスタブを作成します。getComplexServicePort()
メソッドは、ComplexPortType
スタブ実装のインスタンスを返すために使用します。
ComplexService
Web サービスの echoComplexType
オペレーションを呼び出す方法を示す。BasicStruct result = port.echoComplexType(in);
アプリケーションから Web サービス オペレーションを呼び出すメソッドは、java.rmi.RemoteException
および javax.xml.rpc.ServiceException
を送出または捕捉する必要があります。これらの例外は、生成された JAX-RPC スタブから送出されます。
すべての Java ファイル (クライアント アプリケーションおよび clientgen
によって生成されたファイルの両方) をクラス ファイルにコンパイルするには、build.xml
ファイルの build-client
ターゲットに javac
タスクを追加します。該当箇所を次のサンプルに太字で示します。
<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="clientclasses"
packageName="examples.webservices.simple_client"/>
<javac
srcdir="clientclasses"
destdir="clientclasses"
includes="**/*.java"/>
<javac
srcdir="src"
destdir="clientclasses"
includes="examples/webservices/simple_client/*.java"/>
</target>
この例では、1 番目の javac
タスクで clientgen
によって生成された clientclasses
ディレクトリ内の Java ファイルをコンパイルし、2 番目の javac
タスクで現在のディレクトリの examples/webservices/simple_client
サブディレクトリ (Java クライアント アプリケーションのソースの場所と想定されるディレクトリ) 内にある Java ファイルをコンパイルしています。
この例では、clientgen
によって生成された Java ソース ファイルとコンパイル後のクラスが同じディレクトリ (clientclasses
) に格納されます。プロトタイピングの段階ではこれで十分ですが、多くの場合はソース コード (生成されたコードも含む) とコンパイルされたクラスを別々のディレクトリに格納するのがベスト プラクティスです。そのためには、両方の javac
タスクの destdir
に、srcdir
ディレクトリとは異なるディレクトリを設定します。また、clientgen
によって生成された以下のファイルを、clientgen
の出力先ディレクトリから javac
の出力先ディレクトリにコピーする必要もあります。その際、出力先のサブディレクトリの階層は同じになるようにします。
packageName
/ServiceName
_internaldd.xmlpackageName
/ServiceName
_java_wsdl_mapping.xmlpackageName
/ServiceName
_saved_wsdl.wsdl
packageName
は、生成された JAX-RPC スタブのパッケージに対応するサブディレクトリ階層です。ServiceName
は、Web サービスの名前です。
クライアント アプリケーションを実行するには、java
タスクの呼び出しを含む build.xml
に run
ターゲットを追加します。次に例を示します。
<path id="client.class.path">
<pathelement path="clientclasses"/>
<pathelement path="${java.class.path}"/>
</path>
<target name="run" >
<java
fork="true"
classname="examples.webServices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
<arg line="http://${wls.hostname}:${wls.port}/complex/ComplexService" />
</java>
</target>
path
タスクは、CLASSPATH に clientclasses
ディレクトリを追加します。run
ターゲットは Main
アプリケーションを呼び出し、デプロイされた Web サービスの URL を 1 つの引数として渡します。
この手順で説明されている追加のターゲット (clean
など) を含む、完全なサンプル build.xml
ファイルについては、「スタンドアロン Java クライアントのサンプル Ant ビルド ファイル」を参照してください。
アーティファクトを再生成してクラスに再コンパイルするために build-client
ターゲットを再実行してから、run
ターゲットを実行して echoStruct
オペレーションを呼び出します。
prompt> ant build-client run
build.xml
ファイルの build-client
および run
ターゲットを使用して、開発プロセスの一環として Java クライアント アプリケーションを繰り返し更新、再ビルド、および実行できます。
次の例では、スタンドアロン Java クライアントを生成およびコンパイルするための完全な build.xml
ファイルを示します。太字のセクションについては、「クライアントのアーティファクトを生成するための clientgen Ant タスクの使用」および「クライアント アプリケーションのコンパイルと実行」を参照してください。
<project name="webservices-simple_client" default="all">
<!-- このビルドのグローバルなプロパティを設定 -->
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="example-output" value="output" />
<property name="clientclass-dir" value="${example-output}/clientclass" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<target name="clean" >
<delete dir="${clientclass-dir}"/>
</target>
<target name="all" depends="clean,build-client,run" />
<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.simple_client"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/simple_client/*.java"/>
</target>
<target name="run" >
<java fork="true"
classname="examples.webservices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
<arg line="http://${wls.hostname}:${wls.port}/complex/ComplexService"
/>
</java>
</target>
</project>
WebLogic Web サービス内からの Web サービスの呼び出しは、「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」で説明したスタンドアロン Java アプリケーションからの Web サービスの呼び出しに似ています。ただし、呼び出す Web サービスの JAX-RPC スタブを clientgen
Ant タスクを使用して生成する代わりに、呼び出す Web サービスをコンパイルする jwsc
Ant タスクの内部で <jws>
要素の <clientgen>
子要素を使用します。一方、他の Web サービスを呼び出す JWS ファイルでは、Service
および PortType
インスタンスの取得に同じ標準 JAX-RPC API を使用して、Web サービス オペレーションを呼び出します。この節では、Web サービスを J2EE コンポーネント内のクライアントから呼び出す場合と、スタンドアロン クライアントから呼び出す場合の違いについて説明します。
ここでは、読者がすでに「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」に目を通して理解していることを前提としています。また、開発環境でのクライアント アプリケーションのビルドや Java ファイルのコンパイルなどに Ant を使用していること、および別の Web サービスを呼び出すために更新が必要な Web サービスを構築する build.xml
ファイルが、すでにあることを想定しています。
以下のリストでは、クライアント Web サービスのビルドに使用する build.xml
ファイルに加える必要のある変更について説明します。このクライアント Web サービスが、別の Web サービスを呼び出すことになります。build.xml
ファイルの完全なサンプルについては、「Web サービス クライアントのサンプル build.xml ファイル」を参照してください。
クライアント Web サービスを実装する JWS ファイルに加える必要のある変更は以下のとおりです。JWS ファイルの完全なサンプルについては、「Web サービスを呼び出すサンプル JWS ファイル」を参照してください。
jwsc
Ant タスクの <clientgen>
子要素で生成される一連のファイルをインポートする。これらのファイルには、呼び出される Web サービスのオペレーションでパラメータまたは戻り値として使用するユーザ定義データ型の Java 表現だけでなく、呼び出される Web サービスの JAX-RPC スタブも含まれます。注意 : | ユーザ定義のデータ型は、WSDL の XML スキーマ データ型に基づくパッケージ内に生成されます。clientgen で指定されるパッケージ内ではないことに注意します。ただし、JAX-RPC スタブでは <clientgen> 要素の packageName 属性で指定されるパッケージ名が使用されます。 |
java.rmi.RemoteException
および javax.xml.rpc.ServiceException
の両方を送出または捕捉するように更新する。
次に示すサンプル build.xml
ファイルでは、別の Web サービスを呼び出す Web サービスを作成する方法を示します。別の Web サービスを呼び出さない単純な Web サービスをビルドするための build.xml
と異なっている部分は、太字で示されています。
この場合の build-service
ターゲットは、単純な Web サービスをビルドするターゲットとよく似ています。唯一の違いは、呼び出す Web サービスをビルドする jwsc
Ant タスクに <jws>
要素の <clientgen>
子要素も含まれるという点で、これによって jwsc
では必要な JAX-RPC クライアント スタブも生成されるようになります。
<project name="webservices-service_to_service" default="all">
<!-- このビルドのグローバルなプロパティを設定 -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="ClientServiceEar" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/ClientServiceEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all" depends="clean,build-service,deploy,client"/>
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}">
<jws
file="examples/webservices/service_to_service/ClientServiceImpl.java">
<clientgen
</jws>
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
packageName="examples.webservices.service_to_service" />
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}"
failonerror="false"
user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/ClientService/ClientService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.service_to_service.client"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/service_to_service/client/**/*.java"/>
</target>
<target name="run">
<java classname="examples.webservices.service_to_service.client.Main"
fork="true"
failonerror="true" >
<classpath refid="client.class.path"/>
<arg
line="http://${wls.hostname}:${wls.port}/ClientService/ClientService"/>
</java>
</target>
</project>
次に示すサンプル JWS ファイル (ClientServiceImpl.java
) は、ClientService
という Web サービスを実装しています。この Web サービスには、ComplexService
という Web サービスの echoComplexType
オペレーションを順番に呼び出すオペレーションが含まれています。このオペレーションでは、パラメータとしても戻り値としてもユーザ定義データ型 (BasicStruct
) を使用します。コードの該当部分を太字で示し、サンプルの後で説明を加えます。
package examples.webservices.service_to_service;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.jws.WebService;
import javax.jws.WebMethod;
import weblogic.jws.WLHttpTransport;
// clientgen によって生成され、ComplexService Web サービスによって使用される
// BasicStruct データ型をインポートする
import examples.webservices.complex.BasicStruct;
// ComplexService Web サービスを呼び出すための JAX-RPC スタブをインポートする
// clientgen によって生成されるスタブ
import examples.webservices.service_to_service.ComplexPortType;
import examples.webservices.service_to_service.ComplexService_Impl;
import examples.webservices.service_to_service.ComplexService;
@WebService(name="ClientPortType", serviceName="ClientService",
targetNamespace="http://examples.org")
@WLHttpTransport(contextPath="ClientService", serviceUri="ClientService",
portName="ClientServicePort")
public class ClientServiceImpl {
@WebMethod()
public String callComplexService(BasicStruct input, String serviceUrl)
throws ServiceException, RemoteException
{
// ComplexService を呼び出すサービスおよびポート スタブを作成する
ComplexService service = new ComplexService_Impl(serviceUrl + "?WSDL");
ComplexPortType port = service.getComplexServicePort();
// ComplexService の echoComplexType オペレーションを呼び出す
BasicStruct result = port.echoComplexType(input);
System.out.println("Invoked ComplexPortType.echoComplexType." );
return "Invoke went okay! Here's the result: '" + result.getIntValue() + ", " + result.getStringValue() + "'";
}
}
別の Web サービスを呼び出す JWS ファイルをプログラミングする際は、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプル内では太字で示されています。
ComplexService
で BasicStruct
JavaBean を使用しています。import examples.webservices.complex.BasicStruct;
ComplexService
Web サービスの JAX-RPC スタブをインポートする。このスタブは、<jws>
の <cliengen>
子要素によって生成されます。import examples.webservices.service_to_service.ComplexPortType;
import examples.webservices.service_to_service.ComplexService_Impl;
import examples.webservices.service_to_service.ComplexService;
ServiceException
および RemoteException
を送出または捕捉するようにする。throws ServiceException, RemoteException
ComplexService
の JAX-RPC Service および Port インスタンスを作成する。ComplexService service = new
ComplexService_Impl(serviceUrl + "?WSDL");
ComplexPortType port = service.getComplexServicePort();
ComplexService
の echoComplexType
オペレーションを、直前にインスタンス化したポートを使用して呼び出す。BasicStruct result = port.echoComplexType(input);
プロキシ サーバを使用すると、クライアント アプリケーションから、呼び出される Web サービスをホストするアプリケーション サーバ (WebLogic、非 WebLogic いずれでも) へのリクエストをプロキシできます。通常、プロキシ サーバは、アプリケーション サーバがファイアウォールの内側にある場合に使用します。クライアント アプリケーションでプロキシ サーバを指定する方法は 2 つあります。WebLogic HttpTransportInfo
API でプログラム的に行う方法と、システム プロパティを使用する方法です。
Web サービスを呼び出す際にプロキシ サーバを使用する場合の完全なサンプルについては、「dev2dev のコード例のサイトのサンプル」を参照してください。
標準の java.net.*
クラスと、WebLogic 固有の HttpTransportInfo
API を使用することにより、Web サービスの呼び出しをプロキシするプロキシ サーバの詳細を、Java クライアント アプリケーション自体の中でプログラム的に指定できます。java.net
クラスを使用して、プロキシ サーバを示す Proxy
オブジェクトを作成します。その後で、HttpProxySampleService
Web サービスの echo
オペレーションを呼び出す以下のサンプル クライアントに示すように、WebLogic API とプロパティを使用して JAX-RPC スタブ上でプロキシ サーバを設定します。太字で示したコードについては、サンプルの後で説明します。
package dev2dev.proxy.client;
import javax.xml.rpc.Stub;
import java.net.Proxy;
import java.net.InetSocketAddress;
import weblogic.wsee.connection.transport.http.HttpTransportInfo;
/**
* プログラムによる API によりプロキシ サーバ経由でサービスを呼び出す
* サンプル クライアント
*/
public class HttpProxySampleClient {
public static void main(String[] args) throws Throwable{
assert args.length == 5;
String endpoint = args[0];
String proxyHost = args[1];
String proxyPort = args[2];
String user = args[3];
String pass = args[4];
// サービスとポートを作成する
HttpProxySampleService service = new HttpProxySampleService_Impl();
HttpProxySamplePortType port = service.getHttpProxySamplePortTypeSoapPort();
// エンドポイント アドレスを設定する
((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endpoint);
// プロキシ サーバ情報を設定する
Proxy p = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
HttpTransportInfo info = new HttpTransportInfo();
info.setProxy(p);
((Stub)port)._setProperty("weblogic.wsee.connection.transportinfo",info);
// プロキシ認証情報を設定する
((Stub)port)._setProperty("weblogic.webservice.client.proxyusername",user);
((Stub)port)._setProperty("weblogic.webservice.client.proxypassword",pass);
// 呼び出し
String s = port.echo("Hello World!");
System.out.println("echo: " + s);
}
}
上記サンプルのうち、留意すべきセクションは、次のとおりです。
java.net.*
クラスのインポート。import java.net.Proxy;
import java.net.InetSocketAddress;
HttpTransportInfo
API のインポート。import weblogic.wsee.connection.transport.http.HttpTransportInfo;
Proxy
オブジェクトの作成。Proxy p = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
引数 proxyHost
および proxyPort
は、プロキシ サーバのホスト コンピュータおよびポートを表します。
HttpTransportInfo
オブジェクトを作成し、setProxy() メソッドを使用してプロキシ サーバ情報を設定。HttpTransportInfo info = new HttpTransportInfo();
info.setProxy(p);
weblogic.wsee.connection.transportinfo
WebLogic スタブ プロパティを使用して、JAX-RPC スタブ上で HttpTransportInfo
オブジェクトを設定。((Stub)port)._setProperty("weblogic.wsee.connection.transportinfo",info);
weblogic.webservice.client.proxyusername
および weblogic.webservice.client.proxypassword
を使用して、プロキシ サーバへのアクセスが認証されているユーザのユーザ名とパスワードを指定。((Stub)port)._setProperty("weblogic.webservice.client.proxyusername",user);
((Stub)port)._setProperty("weblogic.webservice.client.proxypassword",pass);
別の方法としては、次の例に示すように、HttpTransportInfo
API の setProxyUsername()
および setProxyPassword()
メソッドを使用してプロキシ ユーザ名とパスワードを設定することもできます。
info.setProxyUsername("juliet".getBytes());
info.setProxyPassword("secret".getBytes());
プロキシ サーバの指定にシステム プロパティを使用する場合は、クライアント アプリケーションの記述は標準的な方式で行い、クライアント アプリケーションの実行時に以下のシステム プロパティを指定します。
proxyHost
はプロキシ サーバが動作しているホスト コンピュータの名前、proxyPort
はプロキシ サーバがリスンしているポート、proxyUsername
は認証されているプロキシ サーバ ユーザ、proxyPassword
はユーザのパスワードです。
以下の Ant ビルド スクリプトの抜粋では、clients.InvokeMyService
というクライアント アプリケーションを呼び出す場合のシステム プロパティの設定例を示します。
<target name="run-client">
<java fork="true"
classname="clients.InvokeMyService"
failonerror="true">
<classpath refid="client.class.path"/>
<arg line="${http-endpoint}"/>
<jvmarg line=
"-DproxySet=true
-DproxyHost=${proxy-host}
-DproxyPort=${proxy-port}
-Dweblogic.webservice.client.proxyusername=${proxy-username}
-Dweblogic.webservice.client.proxypassword=${proxy-passwd}"
/>
</java>
</target>
WebLogic Server ではプロダクションの再デプロイメントをサポートしています。つまり、更新後の新しいバージョンの WebLogic Web サービスを同じ Web サービスの古いバージョンと並行してデプロイできます。
WebLogic Server では、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでに Web サービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続けます。作業が完了した時点で、自動的に古い Web サービスが廃止されます。クライアントが会話形式の Web サービスまたは信頼性のある Web サービスに接続している場合、既存の会話メッセージング シーケンスまたは信頼性のあるメッセージング シーケンスが、クライアントによって明示的に終了されるか、タイムアウトになったときに、クライアントの作業が完了したと見なされます。
Web サービスの新しいバージョンで以下の Web サービス アーティファクトが変更されていなければ、その新しいバージョンで古いクライアント アプリケーションを引き続き使用できます。
上記のアーティファクトのいずれかが変更されている場合、clientgen
Ant タスクを再び実行して、クライアント アプリケーションで使用される JAX-RPC スタブを再生成する必要があります。
たとえば、Web サービスの新しいバージョンでオペレーションのシグネチャを変更すると、Web サービスの新しいバージョンを記述する WSDL ファイルも変更されます。この場合、JAX-RPC スタブを再生成する必要があります。ただし、単にオペレーションの実装だけを変更し、オペレーションのパブリック コントラクトは変更しない場合、既存のクライアント アプリケーションを引き続き使用できます。
「SOAP メッセージ ハンドラの作成と使用」では、WebLogic Server で動作する Web サービスの一環として実行されるサーバサイド SOAP メッセージ ハンドラを作成する方法について説明しました。この他に、Web サービス オペレーションを呼び出すクライアント アプリケーションの一環として実行される、クライアントサイド SOAP メッセージ ハンドラを作成することもできます。クライアントサイド ハンドラの場合は、以下のタイミングで二度実行されます。
クライアントサイド SOAP メッセージ ハンドラは、スタンドアロン クライアントと、WebLogic Server 内部で実行されるクライアントの、双方のためにコンフィグレーションできます。
実際の Java クライアントサイド ハンドラは、サーバサイド ハンドラと同じ方法、つまり javax.xml.rpc.handler.GenericHandler
抽象クラスを拡張する Java クラスを記述する方法で作成できます。多くの場合、WebLogic Server で実行される Web サービスとその Web サービスを呼び出すクライアント アプリケーションで、同じハンドラ クラスを使用できます。たとえば、サーバおよびクライアント用として、送信および受信したすべての SOAP メッセージをログに記録する汎用ロギング ハンドラ クラスを記述できます。
サーバサイド SOAP ハンドラのプログラミングと同様に、クライアントサイド SOAP メッセージ ハンドラを呼び出す clientgen
Ant タスクも XML ファイルを使用して指定します。ただし、次の手順で説明するように、この XML ファイルの XML スキーマは少し異なります。
次の手順では、Web サービス オペレーションを呼び出すクライアントアプリケーションにクライアントサイド SOAP メッセージ ハンドラを追加する高度な手順を説明します。
デプロイされた Web サービスを呼び出すクライアント アプリケーションをすでに作成済みであり、クライアントサイド SOAP メッセージ ハンドラおよびハンドラ チェーンを追加することでクライアント アプリケーションを更新することを想定しています。また、Ant ベースの開発環境を設定済みであり、かつ clientgen
Ant タスクを実行するためのターゲットを含む、作業用の build.xml
ファイルがあることが前提となっています。詳細については、「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」を参照してください。
「SOAP メッセージ ハンドラおよびハンドラ チェーンの設計」を参照してください。
javax.xml.rpc.handler.GenericHandler
抽象クラスを拡張する Java クラスを作成します。この手順は、チェーン内のハンドラをサーバではなくクライアントで実行する点を除けば、サーバサイド ハンドラの場合の手順と非常に似ています。
ハンドラ クラスのプログラミングの詳細については、「GenericHandler クラスの作成」を参照してください。サンプルについては、「クライアントサイド ハンドラ クラスの例」を参照してください。
「クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの作成」を参照してください。
build.xml
ファイルを更新して、clientgen
Ant タスクに SOAP ハンドラのコンフィグレーション ファイルの名前を指定します。また、build.xml
ファイルによってハンドラ ファイルが Java クラスにコンパイルされ、クライアント アプリケーションで使用できる状態になることも確認します。
「クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの clientgen への指定」を参照してください。
prompt> ant build-client
次回クライアント アプリケーションを実行したときには、SOAP リクエスト メッセージの送信前と応答の受信後に、コンフィグレーション ファイルに記述した SOAP メッセージ ハンドラが自動的に実行されます。
注意 : | clientgen Ant タスクにハンドラのコンフィグレーション ファイルが指定されている限り、クライアントサイド SOAP メッセージ ハンドラを呼び出すために実際のクライアント アプリケーションを更新する必要はありません。ハンドラは、生成された JAX-RPC スタブによって自動的に正しい順序で実行されます。 |
次の例では、Web サービスを呼び出すクライアント アプリケーション用にコンフィグレーションできる単純な SOAP メッセージ ハンドラ クラスを示します。
package examples.webservices.client_handler.client;
import javax.xml.namespace.QName;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.GenericHandler;
import javax.xml.rpc.handler.MessageContext;
public class ClientHandler1 extends GenericHandler {
private QName[] headers;
public void init(HandlerInfo hi) {
System.out.println("in " + this.getClass() + " init()");
}
public boolean handleRequest(MessageContext context) {
System.out.println("in " + this.getClass() + " handleRequest()");
return true;
}
public boolean handleResponse(MessageContext context) {
System.out.println("in " + this.getClass() + " handleResponse()");
return true;
}
public boolean handleFault(MessageContext context) {
System.out.println("in " + this.getClass() + " handleFault()");
return true;
}
public QName[] getHeaders() {
return headers;
}
}
クライアントサイド SOAP ハンドラのコンフィグレーション ファイルでは、ハンドラ チェーン内のハンドラのリスト、ハンドラが実行される順序、初期化パラメータなどを指定します。このファイルの詳細については、「クライアントサイド ハンドラのコンフィグレーション ファイル用 XML スキーマ」を参照してください。
このコンフィグレーション ファイルでは、1 つまたは複数のハンドラを含む 1 つのハンドラ チェーンを XML で記述します。次に単純な例を示します。
<weblogic-wsee-clientHandlerChain
xmlns="http://www.bea.com/ns/weblogic/90"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">
<handler>
<j2ee:handler-name>clienthandler1</j2ee:handler-name>
<j2ee:handler-class>examples.webservices.client_handler.client.ClientHandler1</j2ee:handler-class>
<j2ee:init-param>
<j2ee:param-name>ClientParam1</j2ee:param-name>
<j2ee:param-value>value1</j2ee:param-value>
</j2ee:init-param>
</handler>
<handler>
<j2ee:handler-name>clienthandler2</j2ee:handler-name>
<j2ee:handler-class>examples.webservices.client_handler.client.ClientHandler2</j2ee:handler-class>
</handler>
</weblogic-wsee-clientHandlerChain>
この例では、ハンドラ チェーンに 2 つのハンドラ (clienthandler1
および clienthandler2
) が含まれており、<j2ee:handler-class>
要素に指定されたクラス名で実装されています。これら 2 つのハンドラは、クライアント アプリケーションが SOAP リクエストを Web サービスに送信する直前に指定の順序で実行され、クライアント アプリケーションが Web サービスからの SOAP 応答を受信した直後に逆の順序で実行されます。
この例では、<j2ee:init-param>
要素を使用して 1 つまたは複数の初期化パラメータをハンドラに指定する方法も示しています。
ハンドラによって実装される SOAP ロール、ハンドラによって処理される SOAP ヘッダ、およびハンドラが関連付けられている WSDL のポート名要素を指定するには、それぞれ、<handler>
要素の子要素である <soap-role>
、<soap-header>
、および <port-name>
を使用します。
次の XML スキーマ ファイルでは、クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの構造を定義しています。
<?xml version="1.0" encoding="UTF-8"?>
<schema
targetNamespace="http://www.bea.com/ns/weblogic/90"
xmlns:wls="http://www.bea.com/ns/weblogic/90"
xmlns:j2ee="http://java.sun.com/xml/ns/j2ee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
>
<include schemaLocation="weblogic-j2ee.xsd"/>
<element name="weblogic-wsee-clientHandlerChain"
type="wls:weblogic-wsee-clientHandlerChainType">
<xsd:key name="wsee-clienthandler-name-key">
<xsd:annotation>
<xsd:documentation>
Defines the name of the handler. The name must be unique within the
chain.
</xsd:documentation>
</xsd:annotation>
<xsd:selector xpath="j2ee:handler"/>
<xsd:field xpath="j2ee:handler-name"/>
</xsd:key>
</element>
<complexType name="weblogic-wsee-clientHandlerChainType">
<sequence>
<xsd:element name="handler"
type="j2ee:service-ref_handlerType"
minOccurs="0" maxOccurs="unbounded">
</xsd:element>
</sequence>
</complexType>
</schema>
1 つのコンフィグレーション ファイルで、1 つのクライアントサイド ハンドラ チェーンを指定します。コンフィグレーション ファイルのルートは <weblogic-wsee-clientHandlerChain>
で、ファイルにはゼロ個以上の <handler>
子要素が含まれます。これらの各子要素で、チェーン内の各ハンドラを記述します。
<handler>
要素の構造は、「J2EE 1.4 Web Service client XML Schema」で指定されている J2EE の service-ref_handlerType
複合型で記述します。
クライアントサイド SOAP ハンドラのコンフィグレーション ファイルを指定するには、clientgen
Ant タスクの handlerChainFile
属性を使用します。次に、build.xml
ファイルからの抜粋を示します。
<clientgen
wsdl="http://ariel:7001/handlers/ClientHandlerService?WSDL"
destDir="${clientclass-dir}"
handlerChainFile="ClientHandlerChain.xml"
packageName="examples.webservices.client_handler.client"/>
clientgen
によって自動的に生成された JAX-RPC スタブを使用すると、クライアント アプリケーションが Web サービス オペレーションを呼び出す前と後に、コンフィグレーション ファイルで記述されたハンドラが必ず正しい順序で実行されます。
「メッセージレベルのセキュリティ コンフィグレーションに対する WS-Policy ファイルの使い方」では、WebLogic Web サービスのメッセージレベルのセキュリティを記述する 1 つまたは複数の WS-Policy ファイルに、Web サービスを関連付ける方法について説明しています。これらの WS-Policy ファイルは、SOAP メッセージのデジタル署名やデジタル暗号化の方法と、Web サービスを呼び出すクライアントで必要になるユーザ認証の種類を記述する XML ファイルです。通常、Web サービスに関連付けられた WS-Policy ファイルはその WSDL にアタッチされます。Web サービス クライアント ランタイムはこれを読み取り、クライアント アプリケーションから呼び出されたオペレーションからの SOAP メッセージ リクエストのデジタル署名やデジタル暗号化を行うかどうかを判別したり、行う場合はその方法を判別したりします。
しかし、Web サービスがデプロイ済みの WSDL に WS-Policy ファイルをアタッチしない場合や、Web サービスが WSDL をまったく公開しないようにコンフィグレーションされている場合もあります。これらの場合、Web サービス クライアント ランタイムは、SOAP メッセージ リクエストのために有効にしなければならないセキュリティをサービス自体から判別することはできません。代わりに、WS-Policy ファイルのクライアントサイドのコピーをロードする必要があります。この節では、クライアント アプリケーションを更新して、WS-Policy ファイルのローカル コピーがロードされるようにする方法について説明します。
通常、クライアントサイド WS-Policy ファイルは、デプロイ済みの Web サービスに関連付けられている WS-Policy ファイルとまったく同じものです。これら 2 つのファイルが異なり、ファイルに含まれるセキュリティ アサーションに矛盾がある場合は、Web サービス オペレーションを呼び出すとエラーが返されます。
クライアントサイド WS-Policy ファイルは、SOAP メッセージのリクエスト、応答、またはその両方に関連付けることができます。また、WS-Policy ファイルを Web サービス全体と関連付けるのか、Web サービスのオペレーションのうちの 1 つだけと関連付けるのかを指定できます。
次の手順では、Web サービス オペレーションを呼び出すクライアントアプリケーションに WS-Policy ファイルを関連付ける高度な手順を説明します。
デプロイされた Web サービスを呼び出すクライアント アプリケーションを作成済みであり、クライアントサイド WS-Policy ファイルを関連付けることでクライアント アプリケーションを更新することを想定しています。また、Ant ベースの開発環境を設定済みであり、かつ clientgen
Ant タスクを実行するためのターゲットを含む、作業用の build.xml
ファイルがあることが前提となっています。「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」を参照してください。
WS-Policy ファイルの作成については、「カスタム WS-Policy ファイルの作成と使用」を参照してください。
警告 : | クライアント アプリケーションに対して指定できるのは、具象クライアントサイド WS-Policy ファイルのみです。抽象 WS-Policy ファイルや、あらかじめパッケージ化された 3 つのセキュリティ WS-Policy ファイルは使用できません。 |
clientgen
Ant タスクが JAX-RPC スタブ内に追加の get
XXX
Port()
メソッドを生成するように指定し、クライアント アプリケーションをビルドする build.xml
ファイルを更新します。XXX
は Web サービスの名前です。これらのメソッドは、後ほどクライアント アプリケーションがクライアントサイド WS-Policy ファイルをロードする際に使用します。
「WS-Policy ファイルをロードするメソッドを生成するための clientgen の更新」を参照してください。
clientgen
Ant タスクによって生成された追加の get
XXX
Port()
メソッドでクライアントサイド WS-Policy ファイルがロードされるようにします。
「WS-Policy ファイルをロードするためのクライアント アプリケーションの更新」を参照してください。
prompt> ant build-client
次回クライアント アプリケーションを実行したときには、WS-Policy ファイルのローカル コピーがロードされ、Web サービス クライアント ランタイムはこれを使用して SOAP リクエスト メッセージのセキュリティを有効にします。
clientgen
Ant タスクの generatePolicyMethods
属性を true
に設定して、Ant タスクが追加の getXXX()
メソッドを JAX-RPC Service
インタフェースの実装内に生成するように指定し、ポートの取得時に WS-Policy ファイルのクライアントサイド コピーがロードされるようにします。次に例を示します。
<clientgen
wsdl="http://ariel:7001/policy/ClientPolicyService?WSDL"
destDir="${clientclass-dir}"
generatePolicyMethods="true"
packageName="examples.webservices.client_policy.client"/>
生成される追加のメソッドの詳細、およびクライアント アプリケーションでのそれらのメソッドの使用方法については、「WS-Policy ファイルをロードするためのクライアント アプリケーションの更新」を参照してください。
clientgen
で generatePolicyMethods="true"
に設定すると、Ant タスクは WS-Policy ファイルのロードに使用できる JAX-RPC Service
インタフェースの実装内に追加メソッドを生成します。XXX
は Web サービスの名前です。WS-Policy ファイルの配列または集合を、Web サービスへの複数ファイルの関連付けに使用できます。単一の WS-Policy ファイルのみを関連付ける場合は、単一メンバーの配列または集合を作成します。
get
XXX
Port(String operationName, java.util.Set<java.io.InputStream> inbound, java.util.Set<java.io.InputStream> outbound)
クライアントサイド WS-Policy ファイルの別個の 2 つの集合を、InputStreams からロードし、1 つ目の集合を SOAP リクエストに関連付け、2 つ目を SOAP 応答に関連付けます。最初のパラメータで指定されているように、特定のオペレーションに適用されます。
get
XXX
Port(String operationName, java.io.InputStream[] inbound, java.io.InputStream[] outbound)
クライアントサイド WS-Policy ファイルの別個の 2 つの配列を、InputStreams からロードし、1 つ目の配列を SOAP リクエストに関連付け、2 つ目を SOAP 応答に関連付けます。最初のパラメータで指定されているように、特定のオペレーションに適用されます。
get
XXX
Port(java.util.Set<java.io.InputStream> inbound, java.util.Set<java.io.InputStream> outbound)
クライアントサイド WS-Policy ファイルの別個の 2 つの集合を、InputStreams からロードし、1 つ目の集合を SOAP リクエストに関連付け、2 つ目を SOAP 応答に関連付けます。Web サービスのすべてのオペレーションに適用されます。
get
XXX
Port(java.io.InputStream[] inbound, java.io.InputStream[] outbound)
クライアントサイド WS-Policy ファイルの別個の 2 つの配列を、InputStreams からロードし、1 つ目の配列を SOAP リクエストに関連付け、2 つ目を SOAP 応答に関連付けます。Web サービスのすべてのオペレーションに適用されます。
Web サービスのポートを取得すると同時に、そのポートを使用するすべてのオペレーションまたは指定されたオペレーションの呼び出しに対して WS-Policy ファイル (群) が関連付けられるようにするには、パラメータのない通常の getXXXPort()
メソッドではなく、これらのメソッドを使用します。
注意 : | 前のリリースの WebLogic Server からの以下のメソッドは、非推奨となっています。単一のクライアントサイド WS-Policy ファイルの関連付けを行う場合は、単一メンバーの配列または集合を指定し、上述の対応するメソッドを使用します。 |
get
XXX
Port(java.io.InputStream policyInputStream);
単一のクライアントサイド WS-Policy ファイルを InputStream からロードし、SOAP リクエスト (着信) メッセージおよび SOAP 応答 (発信) メッセージの両方に追加します。
get
XXX
Port(java.io.InputStream policyInputStream, boolean inbound, boolean outbound);
単一のクライアントサイド WS-Policy ファイルを InputStream
からロードし、2 番目および 3 番目のパラメータのブール値に応じて、SOAP リクエスト メッセージまたは SOAP 応答メッセージのどちらかに適用します。
次の単純なクライアント アプリケーションでは、これらのポリシー メソッドの使用例を示します。コードの太字部分については、後ほど説明を加えます。
package examples.webservices.client_policy.client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;
import java.io.FileInputStream;
import java.io.IOException;
/**
* ClientPolicyService Web サービスの sayHello オペレーションを呼び出す
* 簡単なスタンドアロンのクライアント アプリケーション
*
* @author Copyright (c) 2004 by BEA Systems. All Rights Reserved.
*/
public class Main {
public static void main(String[] args)
throws ServiceException, RemoteException, IOException {
FileInputStream [] inbound_policy_array = new FileInputStream[2];
inbound_policy_array[0] = new FileInputStream(args[1]);
inbound_policy_array[1] = new FileInputStream(args[2]);
FileInputStream [] outbound_policy_array = new FileInputStream[2];
outbound_policy_array[0] = new FileInputStream(args[1]);
outbound_policy_array[1] = new FileInputStream(args[2]);
ClientPolicyService service = new ClientPolicyService_Impl(args[0] + "?WSDL");
// Web サービスのポートを取得する標準的な方法ClientPolicyPortType normal_port = service.getClientPolicyPort();
// 特定のオペレーションのリクエストと応答のための WS-Policy ファイル
// の配列を指定するClientPolicyPortType array_of_policy_port = service.getClientPolicyPort("sayHello", inbound_policy_array, outbound_policy_array);
try {
String result = null;result = normal_port.sayHello("Hi there!");
System.out.println( "Got result: " + result );
result = array_of_policy_port.sayHello("Hi there!");
} catch (RemoteException e) {
throw e;
}
}
}
クライアント アプリケーションに対する 2 つ目と 3 つ目の引数は、アプリケーションが FileInputStreams
の配列 (inbound_policy_array
および outbound_policy_array
) を作成する元となる 2 つの WS-Policy ファイルです。normal_port
はポートの取得にパラメータのない標準的なメソッドを使用します。一方、array_of_policy_port
はポリシー メソッドの 1 つを使用します。このポリシーメソッドで、ポートを使用する sayHello
オペレーションの呼び出しでは複数の WS-Policy ファイル (FileInputStream
の配列で指定) が、着信および発信の SOAP リクエストおよび応答と関連付けられていることを指定します。
ClientPolicyPortType array_of_policy_port = service.getClientPolicyPort("sayHello", inbound_policy_array, outbound_policy_array);
WebLogic Server には、WebLogic Web サービスの呼び出しに使用する JAX-RPC スタブに対して設定できる一連のスタブ プロパティが用意されています。プロパティの設定には、以下の例のように Stub._setProperty() メソッドを使用します。
((Stub)port)._setProperty(WLStub.MARSHAL_FORCE_INCLUDE_XSI_TYPE,"true");
ほとんどのスタブ プロパティは WLStub
クラスに定義されています。詳細については、weblogic.wsee.jaxrpc.WLStub を参照してください。
WLStub
クラスに定義されていない付加的なスタブ プロパティについては、以下の表で説明します。
![]() ![]() ![]() |