| Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド 11g リリース1 (10.3.3) B61645-01 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Webサービスを呼び出す方法について説明します。
Webサービスを再デプロイする際にクライアント側で考慮すべき事項
|
注意: 次のセクションでは、メッセージ保護されたWebサービスの呼出しについては説明していないため、メッセージ保護されたWebサービスの呼出しについては、『Oracle WebLogic Server WebLogic Webサービスの保護』の「クライアント・アプリケーションの更新によるメッセージ保護されたWebサービスの呼出し」を参照してください。 |
Webサービスの呼出しは、クライアント・アプリケーションがWebサービスを使用するために実行するアクションです。Webサービスを呼び出すクライアント・アプリケーションは、Java、Microsoft .NETなどの任意のテクノロジを使用して記述できます。
クライアント・アプリケーションには以下の2種類があります。
スタンドアロン - 最も単純なスタンドアロン・クライアント・アプリケーションは、javaコマンドで呼び出すMainパブリック・クラスがあるJavaプログラムです。WebLogic Serverとは完全に別個に実行します。
WebLogic ServerにデプロイされたJava EEコンポーネント - この種のクライアント・アプリケーションでは、EJB、サーブレット、または別のWebサービスなど、WebLogic ServerにデプロイされているJava Platform, Enterprise Edition (Java EE)バージョン5コンポーネント内でWebサービスが実行されます。したがって、WebLogic Serverコンテナの内部で実行されます。
後続のセクションでは、JAX-WS仕様のOracleの実装を使用して、Javaクライアント・アプリケーションからWebサービスを呼び出す方法について説明します。この実装を使用することで、WebLogicおよび非WebLogicにかかわらず任意のアプリケーション・サーバーで実行されているWebサービスを呼び出すことができます。さらには、スタンドアロン・クライアント・アプリケーションまたはWebLogic Serverの一部として実行されるクライアント・アプリケーションのどちらも作成できます。
この章では、呼び出す必要のある特定のWebサービス用にServiceインタフェース実装の静的Javaクラスを生成する方法について説明します。動的プロキシ・クライアントの生成の詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』の動的プロキシ・クライアントの作成を参照してください。
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のサンプル」->「サンプル」->「API」->「Webサービス」ノードを展開してください。
このセクションで説明されているコマンド・ライン・ツールの他に、Webサービス・プロキシを生成およびテストするためにOracle JDeveloperまたはOracle Enterprise Pack for Eclipse (OEPE)のようなIDEを使用できます。詳細は、『Oracle WebLogic Server WebLogic Webサービスの紹介』の「WebサービスをビルドするためのOracle IDEの使用」を参照してください。
次の表には、Webサービスを呼び出すスタンドアロン・クライアントを作成する主な手順がまとめられています。
|
注意: 開発環境でのクライアント・アプリケーションのビルドやJavaファイルのコンパイルなどにAntを使用することを前提としています。また、Webサービスのクライアント・タスクで更新する必要のあるbuild.xmlファイルが、すでにあることを想定しています。開発環境でのAntの使用の詳細は、「基本的なAnt build.xmlファイルの作成」を参照してください。このセクションで使用するbuild.xmlファイルのサンプルの全体については、「スタンドアロンJavaクライアントのサンプルAntビルド・ファイル」を参照してください。 |
表6-1 スタンドアロン・クライアントからWebサービスを呼び出す手順
| # |
手順 | 説明 |
|---|---|---|
|
1 |
環境を設定します。 |
コマンド・ウィンドウを開いて、ドメイン・ディレクトリの |
|
2 |
|
|
|
3 |
Webサービスに関する情報(その操作のシグネチャ、ポートの名前など)を取得します。 |
「Webサービスに関する情報の取得」を参照してください。 |
|
4 |
Webサービス操作を呼び出すためのコードを含むクライアント・アプリケーションのJavaコードを記述します。 |
「Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述」を参照してください。 |
|
5 |
基本のAntビルド・ファイル |
「基本的なAnt build.xmlファイルの作成」を参照してください。 |
|
6 |
Javaクライアント・アプリケーションをコンパイルし、実行します。 |
「クライアント・アプリケーションのコンパイルと実行」を参照してください。 |
clientgen WebLogic WebサービスAntタスクは、クライアント・アプリケーションがWebLogic Webサービスと非WebLogic Webサービスの両方の呼出しに使用できるクライアント・アーティファクトを既存のWSDLファイルから生成します。次のようなアーティファクトがあります。
呼出しの対象となる特定のWebサービスに対するServiceインタフェース実装のJavaクラス。
JAXBデータ・バインディング・アーティファクト。
WSDLファイルで指定されたユーザー定義XMLスキーマ・データ型のJavaクラス。
clientgen Antタスクの詳細(使用可能なすべての属性など)は、『『Oracle WebLogic Server WebLogic Webサービス・リファレンス』』の「Antタスク・リファレンス」を参照してください。
次のサンプルのように、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"
type="JAXWS"/>
</target>
clientgen WebLogic WebサービスAntタスクを実行するには、その前にこのタスクの完全なJavaクラス名を標準のtaskdef Antタスクを使用して指定する必要があります。
クライアント側アーティファクトの作成に使用するWSDLファイルと、そうしたアーティファクトの生成先ディレクトリを指定するには、clientgen Antタスクのwsdl属性とdestDir属性を含める必要があります。packageName属性は省略できます。省略した場合、clientgenタスクではWSDLのtargetNamespaceに基づくパッケージ名が使用されます。この例ではtypeを指定する必要があります。指定しない場合、JAXRPCがデフォルト値になります。
この例では、パッケージ名はクライアント・アプリケーションと同じパッケージ名examples.webservices.simple_clientに設定されます。パッケージ名をクライアント・アプリケーションとは異なる名前に設定した場合は、適切なクラス・ファイルをインポートする必要があります。たとえば、examples.webservices.complexというパッケージ名にした場合、クライアント・アプリケーションの以下のクラス・ファイルをインポートする必要があります。
import examples.webservices.complex.BasicStruct; import examples.webservices.complex.ComplexPortType; import examples.webservices.complex.ComplexService;
|
注意: clientgen AntタスクのdestFile属性を使用すると、生成されたJavaファイルを自動的にコンパイルして、すべてのアーティファクトをJARファイルにパッケージ化できます。詳細と例については、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』の「clientgen」を参照してください。 |
WSDLファイルで、Webサービス操作の入力パラメータまたは戻り値としてユーザー定義のデータ型が指定されている場合、clientgenはWSDLに定義されたXMLスキーマ・データ型のJava表現であるJavaBeanクラスを自動的に生成します。JavaBeanクラスは、destDirディレクトリに生成されます。
この手順で説明されている追加のターゲット(cleanなど)を含む、完全なサンプルbuild.xmlファイルについては、「スタンドアロンJavaクライアントのサンプルAntビルド・ファイル」を参照してください。
clientgen Antタスクを他のサポートAntタスクと一緒に実行するには、コマンド・ラインでbuild-clientターゲットを指定します。
prompt> ant build-client
clientclassesディレクトリで、clientgen Antタスクによって生成されたファイルやアーティファクトを確認します。
操作を呼び出すJavaクライアント・アプリケーション・コードの記述に先立って、Webサービスの名前と操作のシグネチャを知る必要があります。Webサービスに関する情報を調べるには様々な方法があります。
一番よいのは、clientgen Antタスクを使用してWebサービス固有のServiceファイルを生成し、生成された*.javaファイルを調べる方法です。*.javaファイルは、destDir属性で指定したディレクトリ内のpackageName属性の値に対応したサブディレクトリに生成されます。packageName属性が指定されていない場合、WSDLのtargetNamespaceに基づくパッケージに対応したサブディレクトリに生成されます。
ServiceName.javaソース・ファイルには、Webサービスのポートを取得するためのgetPortName()メソッドが含まれており、ServiceNameはWebサービス名、PortNameはポート名を意味します。WebサービスがJWSファイルで実装されている場合、Webサービス名は@WebService JWSアノテーションのserviceName属性の値となり、ポート名はjwsc Antタスクの<jws>要素の子要素<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サービス操作を呼び出しています。アプリケーションは、標準JAX-WS APIコードと、clientgenによって生成されたServiceインタフェースのWebサービス固有の実装を使用して、Webサービスの操作を呼び出します。
このサンプルでは、ユーザー定義のデータ型(examples.webservices.simple_client.BasicStruct)を入力パラメータおよび戻り値として使用する操作を呼び出す方法も示します。clientgen Antタスクによって、このユーザー定義のデータ型のJavaコードが自動的に生成されます。
<clientgen> packageName属性はクライアント・アプリケーションと同じパッケージ名に設定されているため、<clientgen>生成ファイルをインポートする必要はありません。
package examples.webservices.simple_client;
/**
* This is a simple stand-alone client application that invokes the
* the echoComplexType operation of the ComplexService Web service.
*/
public class Main {
public static void main(String[] args) {
ComplexService test = new ComplexService();
ComplexPortType port = test.getComplexPortTypePort();
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 test = new ComplexService(), ComplexPortType port = test.getComplexPortTypePort();
ComplexServiceクラスはJAX-WS Serviceインタフェースを実装します。getComplexServicePortTypePort()メソッドは、ComplexPortTypeスタブ実装のインスタンスを返すために使用します。
次のコードは、ComplexService WebサービスのechoComplexType操作を呼び出す方法を示します。
BasicStruct result = port.echoComplexType(in);
echoComplexTypeオペレーションは、BasicStructというユーザー定義データ型を返します。
すべての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"
type="JAXWS"/>
<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ディレクトリとは異なるディレクトリを設定します。クライアント・アプリケーションを実行するには、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"/>
</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">
<!-- set global properties for this build -->
<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"
type="JAXWS"/>
<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"/>
</java>
</target>
</project>
WebLogic Webサービス内からのWebサービスの呼出しは、「スタンドアロン・クライアントからのWebサービスの呼出し:主な手順」で説明したスタンドアロンJavaアプリケーションからのWebサービスの呼出しに似ていますが、次の点が異なります。
呼び出すWebサービスのJAX-WS Serviceインタフェースをclientgen Antタスクを使用して生成するかわりに、呼び出すWebサービスをコンパイルするjwsc Antタスクの内部で<jws>要素の<clientgen>子要素が使用されます。一方、他のWebサービスを呼び出すJWSファイルでは、ServiceおよびPortTypeインスタンスの取得に同じ標準JAX-WS APIを使用して、Webサービス操作を呼び出します。
Webサービスに対する参照の定義に@WebServiceRefアノテーションを使用できます。「@WebServiceRefアノテーションを使用したWebサービス参照の定義」を参照してください。
このセクションでは、WebサービスをJava EEコンポーネント内のクライアントから呼び出す場合と、スタンドアロン・クライアントから呼び出す場合の違いについて説明します。ここでは、読者がすでに「スタンドアロン・クライアントからのWebサービスの呼出し:主な手順」に目を通して理解していることを前提としています。また、開発環境でのクライアント・アプリケーションのビルドやJavaファイルのコンパイルなどにAntを使用していること、および別のWebサービスを呼び出すために更新が必要なWebサービスを構築するbuild.xmlファイルが、すでにあることを想定しています。
次のリストでは、クライアントWebサービスのビルドに使用するbuild.xmlファイルに加える必要のある変更について説明します。このクライアントWebサービスが、別のWebサービスを呼び出すことになります。build.xmlファイルの完全なサンプルについては、「Webサービス・クライアントのサンプルbuild.xmlファイル」を参照してください。
JWSファイル(別のWebサービスを呼び出すWebサービスを実装しているもの)を指定する<jws>要素に、<clientgen>子要素が追加されます。呼び出すWebサービスのWSDLに、必要なwsdl属性を設定します。JAX-WSクライアント・スタブの生成先とするパッケージに、必要なpackageName属性を設定します。
クライアントWebサービスを実装するJWSファイルに加える必要のある変更は次のとおりです。JWSファイルの完全なサンプルについては、「Webサービスを呼び出すサンプルJWSファイル」を参照してください。
jwsc Antタスクの<clientgen>子要素で生成される一連のファイルがインポートされます。これらのファイルには、呼び出されるWebサービスの操作でパラメータまたは戻り値として使用するユーザー定義データ型のJava表現のみでなく、呼び出されるWebサービスのJAX-WS Serviceインタフェースも含まれます。
|
注意: <clientgen>のpackageName属性で設定されているパッケージ名が、クライアント・アプリケーションと同じパッケージ名である場合、<clientgen>生成ファイルをインポートする必要はありません。 |
ServiceおよびPortTypeインタフェース実装を取得して、通常どおりポート上でオペレーションを呼び出します。詳細は、「Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述」を参照してください。
次のサンプル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">
<!-- set global properties for this build -->
<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"
type="JAXWS">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
packageName="examples.webservices.complex" />
</jws>
</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"
type="JAXWS"/>
<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"/>
</java>
</target>
</project>
次に示すサンプルJWSファイル(ClientServiceImpl.java)は、ClientServiceというWebサービスを実装しています。このWebサービスには、ComplexServiceというWebサービスのechoComplexType操作を順番に呼び出す操作が含まれています。この操作では、パラメータとしても戻り値としてもユーザー定義データ型(BasicStruct)を使用します。コードの該当部分を太字で示し、サンプルの後で説明を加えます。
package examples.webservices.service_to_service;
import javax.jws.WebService;
import javax.jws.WebMethod;
// Import the BasicStruct data type, generated by clientgen and used
// by the ComplexService Web Service
import examples.webservices.complex.BasicStruct;
// Import the JAX-WS Stubs for invoking the ComplexService Web Service.
// Stubs generated by clientgen
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;
@WebService(name="ClientPortType", serviceName="ClientService",
targetNamespace="http://examples.org")
public class ClientServiceImpl {
@WebMethod()
public String callComplexService(BasicStruct input, String serviceUrl)
{
// Create service and port stubs to invoke ComplexService
ComplexService test = new ComplexService();
ComplexPortType port = test.getComplexPortTypePort();
// Invoke the echoComplexType operation of ComplexService
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ファイルをプログラミングする際は、次のガイドラインに従います。ガイドラインのサンプル・コードは、上述のサンプル内では太字で示されています。
呼び出されるWebサービスで使用されるユーザー定義データ型をインポートします。このサンプルでは、ComplexServiceでBasicStruct JavaBeanを使用しています。
import examples.webservices.complex.BasicStruct;
ComplexService WebサービスのJAX-WSインタフェースをインポートします。このスタブは、<jws>の<cliengen>子要素によって生成されます。
import examples.webservices.complex.ComplexPortType; import examples.webservices.complex.ComplexService;
ComplexServiceのJAX-WS ServiceおよびPortTypeインスタンスを作成します。
ComplexService test = new ComplexService(); ComplexPortType port = test.getComplexPortTypePort();
ComplexServiceのechoComplexTypeオペレーションを、直前にインスタンス化したポートを使用して呼び出します。
BasicStruct result = port.echoComplexType(input);
@WebServiceRefアノテーションを使用すると、Webサービスへの参照を定義することができます。たとえば、次の例では、WebサービスのWSDLを@WebServiceRefアノテーションに渡すことによってComplexServiceへの参照を定義しています。
package examples.webservices.service_to_service; import javax.jws.WebService; import javax.jws.WebMethod; import javax.xml.ws.WebServiceRef; // Import the BasicStruct data type, generated by clientgen and used // by the ComplexService Web Service import examples.webservices.complex.BasicStruct; // Import the JAX-WS interfaces for invoking the ComplexService Web Service. // Interfaces generated by clientgen import examples.webservices.complex.ComplexPortType; import examples.webservices.complex.ComplexService; @WebService(name="ClientPortType", serviceName="ClientService", targetNamespace="http://examples.org") public class ClientServiceImpl { @WebServiceRef() ComplexService service; @WebMethod() public String callComplexService(BasicStruct input) { // Create service and port stubs to invoke ComplexService ComplexPortType port = service.getComplexPortTypePort(); // Invoke the echoComplexType operation of ComplexService BasicStruct result = port.echoComplexType(input); System.out.println("Invoked ComplexPortType.echoComplexType." ); return "Invoke went okay! Here's the result: '" + result.getIntValue() + ", " + result.getStringValue() + "'"; } }
上記の例で注目すべき点は以下のとおりです。
Webサービスへの参照およびそのインジェクション・ターゲットの定義に@WebServiceRefアノテーションが使用されています。
@WebServiceRef() ComplexService service;
次のコードは、Webサービス参照を使用してComplexPortTypeスタブ実装のインスタンスを戻す方法を示しています。
ComplexPortType port = service.getComplexPortTypePort();
次のコードは、ComplexService WebサービスのsayHello操作を呼び出す方法を示しています。
BasicStruct result = port.echoComplexType(input);
プロキシ・サーバーを使用すると、クライアント・アプリケーションから、呼び出されるWebサービスをホストするアプリケーション・サーバー(WebLogic、非WebLogicいずれでも)へのリクエストをプロキシできます。通常、プロキシ・サーバーは、アプリケーション・サーバーがファイアウォールの内側にある場合に使用します。Javaシステム・プロパティを使用してクライアント・アプリケーションにプロキシ・サーバーを指定できます。クライアント・アプリケーションでプロキシ・サーバーを指定する方法には、WebLogic ClientProxyFeature APIでプログラム的に行う方法と、システム・プロパティを使用する方法の2つがあります。
weblogic.wsee.jaxws.proxy.ClientProxyFeature APIを使用してWebサービスの呼出しをプロキシするプロキシ・サーバーの詳細を、Javaクライアント・アプリケーション自体にプログラムで指定できます。ClientProxyFeature APIの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。
JVMレベルに定義されている設定は、「システム・プロパティを使用したプロキシ・サーバーの指定」に記載されているように、ClientProxyFeatureで定義されたプロキシ・サーバー設定によってオーバーライドされます。
|
注意: ClientProxyFeatureは、WebLogic HTTP over SSLのポートを構成します。WebLogic ServerにはSSLを構成することをお薦めします。詳細は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。 |
次の例で示すように、ClientProxyFeatureを使用してプロキシ・サーバー情報を構成し、Webサービス・ポートの作成時に引数としてClientProxyFeatureを渡すことができます。
例6-1 ポート作成時に引数としてClientProxyFeatureを渡す
package examples.webservices.simple_client; import weblogic.wsee.jaxws.proxy public class Main { public static void main(String[] args) { ComplexService test = new ComplexService(); ClientProxyFeature cpf = new ClientProxyFeature(); cpf.setProxyHost("localhost"); cpf.setProxyPort(8888); cpf.setProxyUserName("proxyu"); cpf.setProxyPassword("proxyp"); ComplexPortType port = test.getComplexPortTypePort(cpf); 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()); } }
または、次の例に示すように、ポートが作成された後にプロキシ・サーバー情報を構成することも可能です。この場合は、attachsPort()メソッドを実行し、既存のポートにClientProxyFeatureをアタッチします。
例6-2 ポート作成後のClientProxyFeatureの構成
package examples.webservices.simple_client; import weblogic.wsee.jaxws.proxy public class Main { public static void main(String[] args) { ComplexService test = new ComplexService(); ComplexPortType port = test.getComplexPortTypePort(); ClientProxyFeature cpf = new ClientProxyFeature(); cpf.setProxyHost("localhost"); cpf.setProxyPort(8888); cpf.setProxyUserName("proxyu"); cpf.setProxyPassword("proxyp"); cpf.attachsPort(port); 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()); } }
ClientProxyFeatureを構成し、クライアント・プロキシ設定を無効化するポートにアタッチしたら、プロキシ・ポートを負の値に設定します。例:
プロキシ・サーバーの指定にシステム・プロパティを使用する場合は、クライアント・アプリケーションの記述は標準的な方式で行い、クライアント・アプリケーションの実行時に以下のシステム・プロパティを指定します。
次の表に、Javaシステム・プロパティをまとめます。
|
注意: その場合は、proxySetのシステム・プロパティを設定することはできません。proxySetのシステム・プロパティが(proxySet=false)に設定されている場合、プロキシ・プロパティは無視され、プロキシは使用できません。 |
表6-2 Javaシステム・プロパティを使用したプロキシ・サーバーの指定
| プロパティ | 説明 |
|---|---|
|
http.proxyHost=proxyHostまたはhttps.proxyHost=proxyHost |
プロキシ・サーバー が動作しているホスト・コンピュータ名。HTTP over SSLに対してhttps.proxyPortを使用します。 |
|
http.proxyPort=proxyPortまたはhttps.proxy.Port=proxyPort |
プロキシ・サーバーがリスニングしているポート。HTTP over SSLに対してhttps.proxyPortを使用します。 |
|
http.nonProxyHosts=hostname | hostname | ... |
プロキシを通さず直接到着するホストのリスト「」>「」文字で各ホスト名を区切ります。このプロパティはHTTPおよびHTTPSの両方に適用されます。 |
以下のAntビルド・スクリプトの抜粋では、clients.InvokeMyServiceというクライアント・アプリケーションを呼び出す場合のJavaシステム・プロパティの設定例を示します。
<target name="run-client">
<java fork="true"
classname="clients.InvokeMyService"
failonerror="true">
<classpath refid="client.class.path"/>
<arg line="${http-endpoint}"/>
<jvmarg line=
"-Dhttp.proxyHost=${proxy-host}
-Dhttp.proxyPort=${proxy-port}
-Dhttp.nonProxyHosts=${mydomain}"
/>
</java>
</target>
WebLogic Serverでは本番再デプロイメントをサポートしています。つまり、更新後の新しいバージョンのWebLogic Webサービスを同じWebサービスの古いバージョンと並行してデプロイできます。
WebLogic Serverでは、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでにWebサービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続けます。作業が完了した時点で、自動的に古いWebサービスが廃止されます。
Webサービスの新しいバージョンで以下のWebサービス・アーティファクトが変更されていなければ、その新しいバージョンで古いクライアント・アプリケーションを引続き使用できます。
Webサービスを記述するWSDL
Webサービスに添付されたWS-Policyファイル
上記のアーティファクトのいずれかが変更されている場合、clientgen Antタスクを再び実行して、クライアント・アプリケーションで使用されるJAX-WSスタブを再生成する必要があります。
たとえば、Webサービスの新しいバージョンで操作のシグネチャを変更すると、Webサービスの新しいバージョンを記述するWSDLファイルも変更されます。この場合、JAX-WSスタブを再生成する必要があります。ただし、単に操作の実装のみを変更し、操作のパブリック・コントラクトは変更しない場合、既存のクライアント・アプリケーションを引続き使用できます。