WebLogic Web サービス プログラマーズ ガイド
この章では、クライアント アプリケーションおよび WebLogic Server から WebLogic および非 WebLogic の Web サービスを呼び出す方法について説明します。
信頼性のある SOAP メッセージングを使用して WebLogic Web サービスを呼び出す方法については、「信頼性のある SOAP メッセージングの使い方」を参照してください。
この章では、クライアント アプリケーションから WebLogic Web サービスを呼び出すときに接続プロトコルとして HTTP/S が使用されるものとします。しかし、それ以外にも、クライアント アプリケーションからの Web サービスの呼び出しに JMS も使用するように、Web サービスをコンフィグレーションすることができます。詳細については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。
Web サービスの呼び出しは、クライアント アプリケーションが Web サービスを使用するために実行するアクションです。Web サービスを呼び出すクライアント アプリケーションは、Java、Microsoft SOAP Toolkit、Microsoft .NET などの任意のテクノロジを使用して記述できます。
注意 : この章では、クライアント アプリケーションという用語を、WebLogic シン クライアントを使用して WebLogic および非 WebLogic の Web サービスを呼び出すスタンドアロン クライアントと、WebLogic Server で実行されている EJB の内部で動作しているクライアントの両方の意味で使用しています。
以降の節では、JAX-RPC 仕様 (バージョン 1.0) の BEA の実装を使用して Java クライアント アプリケーションから Web サービスを呼び出す方法について説明します。この実装を使用することで、WebLogic および非 WebLogic にかかわらず任意のサーバで実行されている Web サービスを呼び出すことができます。さらには、スタンドアロン クライアント アプリケーションまたは WebLogic Server の一部として実行されるクライアント アプリケーションのどちらも作成できます。
WebLogic Server には、Web サービスの呼び出しに必要なクラスがすべて含まれる実行時クライアント JAR ファイルがオプションとして付属しており、スタンドアロン クライアント アプリケーションの開発に便宜が図られています。また、clientgen
Ant タスクを使用すると、クライアント アプリケーションから Web サービスを静的に呼び出すために使用する、JAX-RPC 仕様で定義されているスタブを含む Web サービス固有の JAR ファイルを生成できます。これらのスタブは、Stub
や Service
などの JAX-RPC インタフェースを実装します。
Web サービスの呼び出し時に生じた問題のトラブルシューティングについては、「トラブルシューティング」を参照してください。
JAX-RPC (Java API for XML-based RPC) は、Web サービス API を定義する Sun Microsystems の仕様です。
次の表で、JAX-RPC の中心的なインタフェースとクラスを簡単に説明します。
WebLogic Server には、JAX-RPC 1.0 仕様の実装が組み込まれています。
JAX-RPC の詳細については、「http://java.sun.com/xml/jaxrpc/index.html」を参照してください。
JAX-RPC を使用して Web サービスを呼び出す方法に関するチュートリアルについては、「http://java.sun.com/webservices/docs/ea1/tutorial/doc/JAXRPC.html」を参照してください。
WebLogic Server には、スタンドアロン クライアント アプリケーション (WebLogic Server インスタンス内で実行されていないクライアント アプリケーション) で使用するための、次の実行時クライアント JAR ファイルが付属しています。これらの JAR ファイルは、WL_HOME
/server/lib
ディレクトリにあります。WL_HOME
は、WebLogic Platform の最上位のディレクトリです。
webserviceclient.jar
: JAX-RPC のクライアント実行時実装が含まれます。 webserviceclient+ssl.jar
: webserviceclient.jar
の内容に加えて、SSL の実行時実装が含まれます。SSL を使用して Web サービスを保護するときに、WebLogic Server 付属のクライアント クラスの SSL 実装を使用する場合は、この実行時クライアント JAR ファイルを使用します。
webserviceclient+ssl_pj.jar
: webserviceclient_ssl.jar
の内容と同じですが、J2ME の CDC プロファイルがありません。webserviceclient.jar
ファイル (またはその SSL 版や J2ME 版) を使用するクライアント アプリケーションでは、その CLASSPATH に webservices.jar
または weblogic.jar
を含めないでください。通常の状況では、Web サービスを呼び出すクライアント アプリケーションに必要なクラスは、すべて webserviceclient.jar
に揃っています。しかし、webserviceclient.jar
以外にも、webservices.jar
または weblogic.jar
に含まれる一部のクラスがアプリケーションで必要になる場合があります。その場合は、これらの JAR ファイルを、CLASSPATH で webserviceclient.jar
の後に追加します。
注意 :クライアント機能に関する BEA の現在のライセンスの詳細については、「BEA eLicense Web サイト」を参照してください。
WebLogic Server の WL_HOME/samples/server/src/examples/webservices
ディレクトリには、WebLogic Web サービスの作成および呼び出しの方法として次の例があります。WL_HOME
は、WebLogic Platform のメイン ディレクトリです。
basic.statelessSession
: パラメータと戻り値が組み込みデータ型の値となるステートレス セッション EJB バックエンド コンポーネントを使用します。basic.javaclass
: パラメータと戻り値が組み込みデータ型の値となる Java クラス バックエンド コンポーネントを使用します。complex.statelessSession
: パラメータと戻り値が非組み込みデータ型の値となるステートレス セッション EJB バックエンド コンポーネントを使用します。handler.log
: ハンドラ チェーンとステートレス セッション EJB の両方を使用します。handler.nocomponent
: バックエンド コンポーネントなしでハンドラ チェーンのみを使用します。client.static
: 非 WebLogic Web サービスを呼び出す静的クライアント アプリケーションの作成方法を示します。client.dynamic_wsdl
: WSDL を使用して非 WebLogic Web サービスを呼び出す動的クライアント アプリケーションの作成方法を示します。client.dynamic_no_wsdl
: WSDL を使用しないで非 WebLogic Web サービスを呼び出す動的クライアント アプリケーションの作成方法を示します。上記の例の構築と実行についての詳細な説明は、次の Web ページを参照してください。
WL_HOME
/samples/server/src/examples/webservices/package-summary.html
Web サービスを呼び出す Java クライアント アプリケーションを作成するには、次の手順に従います。
WebLogic または非 WebLogic サーバのいずれかでホストされる Web サービス用のクライアント JAR ファイルを作成する場合は、wsdl
属性を指定します。EAR ファイルにパッケージ化されている WebLogic Web サービス用の場合は、ear
属性を指定します。
clientgen
Ant タスク実行の詳細および例については、「clientgen Ant タスクを実行してクライアント JAR ファイルを生成する」を参照してください。リファレンス情報については、「Web サービス Ant タスクとコマンドライン ユーティリティ」を参照してください。
詳細については、「Web サービスについての情報を取得する」を参照してください。
簡単なクライアント アプリケーションを記述する例については、「Web サービスを呼び出す Java クライアント アプリケーションを作成する」を参照してください。
スタンドアロン クライアント アプリケーションを作成する場合は、WebLogic Server に付属の webserviceclient.jar
実行時 Java クライアント JAR ファイルを必ずアプリケーションの CLASSPATH に含めてください。詳細については、「実行時クライアント JAR ファイル」を参照してください。
クライアント アプリケーションを WebLogic Server で実行している場合は、この実行時クライアント JAR ファイルは必要ありません。
Web サービス固有の JAR ファイルには、Stub
および Service
インタフェースの実装などのスタブが含まれます。これらのスタブは JAX-RPC 仕様で定義されているもので、クライアント アプリケーションが Web サービス (WebLogic、非 WebLogic に関係なく) を呼び出すときに使用されます。必要なコードのほとんどすべてが自動的に生成されます。
注意 :クライアント機能に関する BEA の現在のライセンスの詳細については、「BEA eLicense Web サイト」を参照してください。
clientgen
Ant タスクを実行し、Web サービス固有のクライアント JAR ファイルを自動的に生成するには、次のように行います。
Windows NT では、ドメイン ディレクトリにある setEnv.cmd
コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME
\user_projects\domains\domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリで、domainName
はドメインの名前です。
UNIX では、ドメイン ディレクトリにある setEnv.sh
コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME
/user_projects/domains/domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリで、domainName
はドメインの名前です。
prompt> ant
clientgen
Ant タスクのリファレンス情報については、「clientgen」を参照してください。
以下に、簡単な build.xml
ファイルの例を示します。
コード リスト 7-1 clientgen Ant タスクのサンプル build.xml ファイル
<project name="buildWebservice" default="generate-client">
<target name="generate-client">
<clientgen wsdl="http://example.com/myapp/myservice?WSDL"
packageName="myapp.myservice.client"
clientJar="myapps/myService_client.jar"
/>
</target>
</project>
上の例の build.xml
ファイルを使用して clientgen
タスクを呼び出すと、http://example.com/myapp/myservice?WSDL
WSDL ファイルに記述されている Web サービスを呼び出すクライアント JAR ファイル (myapps/myService_client.jar
) が作成されます。インタフェースとスタブ ファイルは myapp.myservice.client
にパッケージ化されます。
クライアント コードの記述に先立って、Web サービスの名前とオペレーションのシグネチャを知る必要があります。Web サービスに関する情報を調べるにはさまざまな方法があります。
WebLogic Web サービスを呼び出す場合は、そのホーム ページを使用して各オペレーションの完全なシグネチャを取得できます。詳細については、「Web サービスのホーム ページを使用した Web サービスのテスト」を参照してください。
Web サービス オペレーションのシグネチャを取得する 2 番目の方法は、clientgen
Ant タスクを使用して、Web サービス固有のクライアント JAR ファイルを生成し、次にそれを unJAR して、生成された *.java
ファイルを調べる方法です。通常、ServiceName
Port.java
ファイルには、Web サービスのインタフェース定義があります。ServiceName
は Web サービスの名前です。たとえば、buy
および sell
オペレーションのシグネチャは、TraderServicePort.java
ファイルにあります。
最後の方法は、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 サービスを呼び出す Java クライアント アプリケーションを記述する方法について説明します。以降の例では、JAX-RPC API を使用し、BEA が提供する必要な JAR ファイルが CLASSPATH に追加されていることを前提としています。
静的クライアント アプリケーションを使用して Web サービスを呼び出すときは、タイプ分けされた Java インタフェースを使用します。Web サービス固有の JAR ファイルには、次のクラスとインタフェースが入っています。
Service
インタフェースの実装。Stub
インタフェースの実装。次のコードは、サンプルの TraderService
Web サービスを呼び出すクライアント アプリケーションを記述する例です。この例では、TraderService
はスタブ ファクトリで、TraderServicePort
はスタブそのものです。
package examples.webservices.complex.statelessSession;
public class Client {
public static void main(String[] args) throws Exception {
// グローバルな JAXM メッセージ ファクトリをセットアップする
System.setProperty("javax.xml.soap.MessageFactory",
"weblogic.webservice.core.soap.MessageFactoryImpl");
// グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
// 引数リストの解析
Client client = new Client();
String wsdl = (args.length > 0? args[0] : null);
client.example(wsdl);
}
public void example(String wsdlURI) throws Exception {
TraderServicePort trader = null;
if (wsdlURI == null) {
trader = new TraderService_Impl().getTraderServicePort();
} else {
trader = new TraderService_Impl(wsdlURI).getTraderServicePort();
}
String [] stocks = {"BEAS", "MSFT", "AMZN", "HWP" };
// 購入を実行する
for (int i=0; i<stocks.length; i++) {
int shares = (i+1) * 100;
log("Buying "+shares+" shares of "+stocks[i]+".");
TradeResult result = trader.buy(stocks[i], shares);
log("Result traded "+result.getNumberTraded()
+" shares of "+result.getStockSymbol());
}
// 売却を実行する
for (int i=0; i<stocks.length; i++) {
int shares = (i+1) * 100;
log("Selling "+shares+" shares of "+stocks[i]+".");
TradeResult result = trader.sell(stocks[i], shares);
log("Result traded "+result.getNumberTraded()
+" shares of "+result.getStockSymbol());
}
}
private static void log(String s) {
System.out.println(s);
}
}
TraderServicePort
スタブを作成する方法を示す。
trader = new TraderService_Impl(wsdlURI).getTraderServicePort();
TraderService_Impl
スタブ ファクトリは JAX-RPC の Service
インタフェースを実装します。TraderService_Impl
のコンストラクタは、指定されている WSDL URI に基づきスタブを作成します。getTraderServicePort()
メソッドは、TraderService
スタブ実装のインスタンスを返すために使用します。
TraderService
Web サービスの buy
オペレーションを呼び出す方法を示す。
TradeResult result = trader.buy(stocks[i], shares);
Web サービスは、複数の値を返す方法として out または inout パラメータを使用する場合があります。out パラメータおよび inout パラメータの詳細については、「複数の戻り値を実装する」を参照してください。
out または inout パラメータを使用する Web サービスを呼び出すクライアント アプリケーションを記述する場合、out または inout パラメータのデータ型は、javax.xml.rpc.holders.Holder
インタフェースを実装する必要があります。クライアント アプリケーションは、Web サービスを呼び出すと、Holder
オブジェクトの out または inout パラメータを要求して、それらを標準の戻り値と同様に扱います。
たとえば、次の WSDL で記述される Web サービスには、echoStructAsSimpleTypes()
という、標準の in パラメータを 1 つと out パラメータを 3 つ受け取るオペレーションがあります。
http://soap.4s4c.com/ilab/soap.asp?WSDL
次のクライアント アプリケーションは、echoStructAsSimpleTypes()
Web サービス オペレーションを呼び出す 1 つの方法を示しています。
package websvc;
public class Main {
public static void main(String[] args) throws Exception {
// グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
InteropLab_Impl test = new InteropLab_Impl();
InteropTest2PortType soap = test.getinteropTest2PortType();
org.tempuri.x4s4c.x1.x3.wsdl.types.SOAPStruct inputStruct =
new org.tempuri.x4s4c.x1.x3.wsdl.types.SOAPStruct();
inputStruct.setVarInt(10);
inputStruct.setVarFloat(10.1f);
inputStruct.setVarString("hi there");
javax.xml.rpc.holders.StringHolder outputString =
new javax.xml.rpc.holders.StringHolder();
javax.xml.rpc.holders.IntHolder outputInteger =
new javax.xml.rpc.holders.IntHolder();
javax.xml.rpc.holders.FloatHolder outputFloat =
new javax.xml.rpc.holders.FloatHolder();
soap.echoStructAsSimpleTypes(inputStruct, outputString, outputInteger,
outputFloat);
System.out.println("This example shows how to create a static client
application that invokes a non-WebLogic Web Service.");
System.out.println("The webservice used was:
http://soap.4s4c.com/ilab/soap.asp?WSDL");
System.out.println("This webservice shows how to invoke an operation that
uses out parameters. The set parameters are below:");
System.out.println("outputString.value: " + outputString.value);
System.out.println("outputInteger.value: " + outputInteger.value);
System.out.println("outputFloat.value: " + outputFloat.value);
}
}
この節では、オペレーションを非同期に呼び出す方法について説明します。ここでは非同期という用語を、呼び出したオペレーションの結果を必要に応じて、すぐにではなく後で取得するという意味で使用しています。
警告 :この節は、clientgen
Ant タスクによって生成された Web サービス固有のクライアント JAR ファイルを使用する静的なクライアント アプリケーションにのみ適用されます。この節で指定された手順を動的プロキシや Dll ベースのクライアント アプリケーションで使用することはできません。
clientgen
Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成します。次の例に示すように、generateAsyncMethods="True"
属性を必ず指定してください。
<clientgen
wsdl="http://www.mssoapinterop.org/asmx/simple.asmx?WSDL"
clientJar="echoservice.jar"
packageName="examples.async"
generateAsyncMethods="true" />
clientgen
Ant タスクは、Web サービスのオペレーションを非同期に呼び出すために特化された非同期メソッドを JAX-RPC スタブに作成します。詳細については、「非同期 Web サービス クライアントに生成されるスタブの説明」を参照してください。
clientgen
Ant タスク実行の詳細および例については、「clientgen Ant タスクを実行してクライアント JAR ファイルを生成する」を参照してください。リファレンス情報については、「Web サービス Ant タスクとコマンドライン ユーティリティ」を参照してください。
スタンドアロンの非同期クライアント アプリケーションを作成する場合は、WebLogic Server に付属の webserviceclient.jar
実行時 Java クライアント JAR ファイルを必ずアプリケーションの CLASSPATH に含めてください。クライアント アプリケーションが WebLogic Server で実行されている場合 (信頼性のある SOAP メッセージング フレームワークの要素としてなど)、この手順は省略することができます。
webserviceclient.jar
ファイルおよびその他の使用可能な実行時クライアント JAR ファイルの詳細については、「実行時クライアント JAR ファイル」を参照してください。
非同期クライアント アプリケーションの記述についての詳細な API リファレンスは、weblogic.webservice.asyncJavadoc を参照してください。
clientgen
Ant タスクの実行時に generateAsyncMethods="True"
を指定すると、生成される JAX-RPC スタブに、2 つの特殊なメソッドが作成されます。このメソッドは、標準メソッドに加えて、各 Web サービス オペレーションを非同期に呼び出すときに使用します。この特殊なメソッドは、次のような形式になっています。
FutureResult startMethod
(params
, AsyncInfo asyncInfo);result
endMethod
(FutureResult futureResult);
Method
は、Web サービス オペレーションの呼び出しに使用する非同期メソッドの名前を指す。params
は、オペレーション用の一連のパラメータを指す。result
は、オペレーションの結果を指す。FutureResult
は、返されるオペレーション結果のプレースホルダとして使用する WebLogic オブジェクトを指す。AsyncInfo
は、WebLogic Server に追加情報を渡すために使用する WebLogic オブジェクトを指す。注意 :Web サービスのオペレーションがドキュメント指向 (RPC 指向ではなく) の場合は、上記のメソッドに加えて、次の end()
メソッドも作成されます。
result
endConvenienceMethod
(FutureResult futureResult);
ドキュメント指向の Web サービス オペレーションの呼び出しに便利なメソッドを使用する場合は、オペレーションを非同期に呼び出すときに、こちらの end()
メソッドを使用してください。
たとえば、標準的な方法で作成されるスタブに、echoString
という Web サービス オペレーションを呼び出す次のメソッドがあると仮定します。
String echoString (String str);
clientgen
タスクで作成されるスタブに、次の非同期メソッドが追加されます。
FutureResult startEchoString (String str, AsyncInfo asyncInfo);
String endEchoString (FutureResult futureResult);
FutureResult
インタフェースと AsyncInfo
クラスについての詳細な API リファレンスは、weblogic.webservice.asyncJavadoc を参照してください。
Web サービス オペレーションを非同期に呼び出す Java クライアント アプリケーションを記述するときは、最初に次のクラスをインポートする必要があります。
import weblogic.webservice.async.FutureResult;
import weblogic.webservice.async.AsyncInfo;
import weblogic.webservice.async.ResultListener;
import weblogic.webservice.async.InvokeCompletedEvent;
非同期オペレーションの呼び出しは、呼び出しを実行する最初のステップと、完了したオペレーションの結果を後にさまざまな方法で取得する 2 番目のステップで構成されます。
たとえば、クライアント アプリケーションに、SimpleTest
スタブ実装のインスタンスを取得する次の Java コードがあるとします。
SimpleTest echoService = new SimpleTest_Impl();
SimpleTestSoap echoPort = echoService.getSimpleTestSoap();
このとき、Web サービスの echoString
オペレーションを呼び出すとします。この後の節では、このオペレーションを非同期に呼び出すさまざまな方法について説明します。
最も簡単な方法は、次に示すように、最初に startEchoString()
クライアント メソッドを実行し、他の処理を行った後で、endEchoString()
クライアント メソッドを実行する方法です。
FutureResult futureResult = echoPort.startEchoString( "94501", null );
// 処理を行う
String result = echoPort.endEchoString( futureResult );
この例では、end
Method
()
メソッドは endEchoString()
ですが、これは結果が準備できるまでブロックされています。
また、次の例に示すように、FutureResult.isCompleted()
メソッドを使用すると、Web サービスから結果が返されているかどうかをテストできます。
FutureResult futureResult = echoPort.startEchoString( "94501", null );
while( !futureResult.isCompleted() ){
// 処理を行う
}
String result = echoPort.endEchoString( futureResult );
また、次の例に示すように、ResultListener
および InvokeCompletedEvent
クラスを使用すると、オペレーションの結果が返されたことを示すコールバックをリスンするリスナを、クライアント アプリケーションにセット アップできます。
AsyncInfo asyncInfo = new AsyncInfo();
asyncInfo.setResultListener( new ResultListener(){
public void onCompletion( InvokeCompletedEvent event ){
SimpleTestSoap source = (SimpleTestSoap)event.getSource();
try{
String result = source.endEchoString ( event.getFutureResult() );
} catch ( RemoteException e ){
e.printStackTrace ( System.out );
}
}
});
echoPort.startEchoString( "94501", asyncInfo );
次の 2 つの表に、Web サービスを呼び出すクライアント アプリケーションで設定できる WebLogic および標準の JDK 1.4 のシステム プロパティを示します。プロパティの設定には System.setProperty() メソッドを使用します。
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
次の表に、クライアント アプリケーションで設定できる標準の JDK 1.4 のシステム プロパティを示します。
これらのプロパティの詳細については、Sun の「Networking Properties」を参照してください。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WebLogic Server にデプロイされた EJB やサーブレットなどのコンポーネントからの Web サービスの呼び出しは、スタンドアロン クライアントからの Web サービスの呼び出しと本質的には同じです。この章の例で示したコードと同じものを記述し、同じ方法で clientgen
を使用して Web サービス固有のクライアント JAR ファイルを生成します。主な違いは以下のとおりです。
clientgen
Ant タスクで生成された Web サービス固有クライアント JAR ファイルを使用する必要がある場合は、ポータブル スタブを使用する必要がある。詳細については、「ポータブル スタブの作成と使い方」を参照してください。次の表に、Web サービスを呼び出すクライアント アプリケーションのタイプと、それに対応する各種クライアント JAR ファイルの場所を示します。
Web サービスのクライアント JAR ファイル (製品の一環として配布されたものでも clientgen
Ant タスクで生成された Web サービス固有のものでも) を WebLogic Server で動作するアプリケーションの一部として使用する場合、JAR ファイルの Java クラスと WebLogic Server の Java クラスが衝突することがあります。クライアント JAR ファイルがデプロイされている WebLogic Server と、そのクライアント JAR ファイルが生成された WebLogic Server のバージョンが異なるときに、この問題が発生します。この問題を解決するには、ポータブル スタブを使用します。
注意 :Web サービスをホストする WebLogic Server ではなく、Web サービスを呼び出す WebLogic Server インスタンスの clientgen
Ant タスクを使用して Web サービス固有クライアント JAR ファイルを作成することをお勧めします。それができない場合に、ポータブル スタブを使用してください。
ポータブル スタブを使用する必要があるのは、クライアント アプリケーションが WebLogic Server にデプロイされ実行されている場合です。クライアント アプリケーションがスタンドアロンの場合は、必要ありません。
クライアント アプリケーションでポータブル スタブを使用可能にする方法を、以下に示します。
webserviceclient.jar
クライアント JAR ファイルではなく、wsclient81.jar
(WebLogic Server とともに WL_HOME
/server/lib
ディレクトリに配布) と呼ばれる WebLogic Server の各リリースに固有のクライアント JAR ファイルを使用します。wsclient81.jar
ファイルには、標準のクライアント JAR ファイルと同じクラス ファイルを weblogic81.*
というファイル名に変更したものが含まれています。これらのクラス ファイルはバージョンごとに固有のため、WebLogic Server の weblogic.*
クラスと衝突することはありません。clientgen
Ant タスクで生成した Web サービス固有のクライアント JAR ファイルだけでなく、サポートするすべてのクライアント JAR ファイルを VersionMaker
ユーティリティを介して実行します。このユーティリティを使用すると、クライアント JAR ファイルのクラスが以下のように変更されます。こうして変更された新しいバージョン固有のクライアント JAR ファイルを、クライアント アプリケーションで使用します。
VersionMaker
の使用方法の詳細については、「VersionMaker ユーティリティを使用したクライアント JAR ファイルの更新」を参照してください。
クライアント JAR ファイルを更新して、バージョン固有の WebLogic Server クラスを使用するには、以下の手順に従います。
Windows NT では、ドメイン ディレクトリにある setEnv.cmd
コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME
\user_projects\domains\domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリで、domainName
はドメインの名前です。
UNIX では、ドメイン ディレクトリにある setEnv.sh
コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME
/user_projects/domains/domainName
です。BEA_HOME
は BEA Products の最上位のインストール ディレクトリで、domainName
はドメインの名前です。
プロキシ サーバを使用すると、WebLogic Web サービス クライアント アプリケーションから、Web サービスをホストするサーバ (WebLogic、非 WebLogic いずれでも) へのリクエストをプロキシできます。ただし、クライアント アプリケーションの以下のシステム プロパティを必ず設定してください。
http.proxyHost
http.proxyPort
weblogic.webservice.transport.http.proxy.host
weblogic.webservice.transport.http.proxy.port
注意 :Web サービスを呼び出すときに、転送に HTTPS を使用している場合は、前述のプロパティにおける http
を https
に置き換えます。たとえば、http.proxyHost
の代わりに https.proxyHost
を使用します。
これをはじめとするクライアント アプリケーションで設定できる WebLogic システム プロパティの詳細については、「Web サービスのシステム プロパティの使い方」を参照してください。
加えて、クライアント アプリケーションの次のコードに示すように、プロキシ認証を使用するようにプロキシ サーバを設定する必要がある場合は、クライアント アプリケーションのプロパティ weblogic.net.proxyAuthenticatorClassName
を、weblogic.common.ProxyAuthentication
インタフェースを実装する Java クラス名に設定する必要があります。
System.setProperty("weblogic.net.proxyAuthenticatorClassName", "my.ProxyAuthenticator");
この例では、my.ProxyAuthenticator
は、weblogic.common.ProxyAuthentication
インタフェースを実装する、クライアント アプリケーションの CLASSPATH にあるクラスです。
weblogic.common.ProxyAuthentication
インタフェースにより、クライアント アプリケーションは、ユーザ認証を要求するプロキシ サーバを通じて WebLogic HTTP および SSL をトンネリングする場合に必要とされるユーザ認証情報を提供できます。このインタフェースの実装の詳細については、weblogic.common.ProxyAuthentication
Javadoc を参照してください。
以下の節では、高度なクライアント アプリケーションを記述する例について説明します。
たとえば、組み込みデータ型と WSDL を使用して次の URL にある Web サービスを呼び出す動的クライアント アプリケーションを作成するとします。
http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl
注意 :動的なクライアント アプリケーションから呼び出す Web サービスに非組み込みデータ型が使用されている場合は、「非組み込みデータ型を使用する動的クライアントを記述する」を参照してください。
次に、動的クライアント アプリケーションの Java コードの記述例を示します。
import java.net.URL;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
public class Main {
public static void main(String[] args) throws Exception {
// グローバルな SAAJ メッセージ ファクトリをセットアップする
System.setProperty("javax.xml.soap.MessageFactory",
"weblogic.webservice.core.soap.MessageFactoryImpl");
// グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
// サービス ファクトリを作成
ServiceFactory factory = ServiceFactory.newInstance();
// QName を定義
String targetNamespace =
"http://www.themindelectric.com/"
+ "wsdl/net.xmethods.services.stockquote.StockQuote/";
QName serviceName =
new QName(targetNamespace,
"net.xmethods.services.stockquote.StockQuoteService");
QName portName =
new QName(targetNamespace,
"net.xmethods.services.stockquote.StockQuotePort");
QName operationName = new QName("urn:xmethods-delayed-quotes",
"getQuote");
URL wsdlLocation =
new URL("http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl");
// サービスを作成
Service service = factory.createService(wsdlLocation, serviceName);
// 呼び出しを作成
Call call = service.createCall(portName, operationName);
// リモートの Web サービスを呼び出し
Float result = (Float) call.invoke(new Object[] {
"BEAS"
});
System.out.println("\n");
System.out.println("This example shows how to create a dynamic client
application that invokes a non-WebLogic Web Service.");
System.out.println("The webservice used was:
http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl");
System.out.println("The quote for BEAS is: ");
System.out.println(result);
}
}
注意 :javax.xml.rpc.Call API を使用して WSDL を使用する動的クライアントを作成する場合、以下のメソッドはクライアント アプリケーションで使用できません。
また、getTargetEndpointAddress()
メソッドを実行する必要がある場合は、たとえ WSDL で targetEndPointAddress を利用できる場合でも、事前に setTargetEndpointAddress()
メソッドが実行されている必要があります。
WSDL を使用しない動的クライアントは WSDL を使用するクライアントに似ていますが、クライアントが WSDL を使用しない場合、オペレーションに対するパラメータ、ターゲットのエンドポイント アドレスなど、WSDL にある情報を明示的に設定する必要があります。
次の例は、クライアント アプリケーションで WSDL を指定せずに Web サービスを呼び出すクライアント アプリケーションの作成方法を示しています。
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
public class Main {
public static void main(String[] args) throws Exception {
// グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
// サービス ファクトリを作成
ServiceFactory factory = ServiceFactory.newInstance();
// QName を定義
String targetNamespace =
"http://www.themindelectric.com/"
+ "wsdl/net.xmethods.services.stockquote.StockQuote/";
QName serviceName =
new QName(targetNamespace,
"net.xmethods.services.stockquote.StockQuoteService");
QName portName =
new QName(targetNamespace,
"net.xmethods.services.stockquote.StockQuotePort");
QName operationName = new QName("urn:xmethods-delayed-quotes",
"getQuote");
// サービスを作成
Service service = factory.createService( serviceName );
// 呼び出しを作成
Call call = service.createCall();
// ポートとオペレーション名を設定
call.setPortTypeName(portName);
call.setOperationName(operationName);
// パラメータを追加
call.addParameter("symbol",
new QName("http://www.w3.org/2001/XMLSchema", "string"),
ParameterMode.IN);
call.setReturnType(new QName( "http://www.w3.org/2001/XMLSchema","float") );
// エンド ポイント アドレスを設定
call.setTargetEndpointAddress("http://www.xmethods.com:9090/soap");
// リモートの Web サービスを呼び出し
Float result = (Float) call.invoke(new Object[] {
"BEAS"
});
System.out.println("\n");
System.out.println("This example shows how to create a dynamic client
application that invokes a non-WebLogic Web Service.");
System.out.println("The webservice used was:
http://www.themindelectric.com/wsdl/net.xmethods.services.stockquote.StockQuote");
System.out.println("The quote for BEAS is:");
System.out.println(result);
}
}
注意 :WSDL を使用しない動的クライアントでは、getPorts()
メソッドは常に null
を返します。 この動作は、WSDL を使用する動的クライアントとは異なります。WSDL を使用する動的クライアントの場合、メソッドは実際にポートを返します。
パラメータまたは戻り値に非組み込みデータ型を使用する Web サービスを呼び出す動的クライアントを記述するときは、次の処理も行う必要があります。
autotype
Ant タスクを使用して作成するか (「autotype」を参照)、または手動で作成します (「シリアライゼーション クラスを記述する」を参照)。ServiceFactory
の JAX-RPC TypeMappingRegistry
を使用してシリアライゼーション クラスを登録する。TypeMappingRegistry
の詳細については、JAX-RPC 1.0 仕様を参照してください。
注意 :clientgen
Ant タスクを使用すると、必要なすべてのシリアライゼーション クラスが自動的に生成され、さらにはそのシリアライゼーション クラスを正しく使用するスタブも作成されるため、非組み込みデータ型を使用するときは、静的なクライアント アプリケーションを使用することをお勧めします。
次の例では、TypeMappingRegistry
を使用して、SOAPStructCode
という名前のシリアライゼーション クラスをクライアント アプリケーションに登録する方法について説明します。該当するコード箇所は太字になっています。
import javax.xml.soap.SOAPConstants;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;
import org.soapinterop.xsd.SOAPStructCodec;
import org.soapinterop.xsd.SOAPStruct;
public class MSInterop{
public static void main(String[] args) throws Exception {
// weblogic ServiceFactory を設定
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl" );
// サービス ファクトリを作成
ServiceFactory factory = ServiceFactory.newInstance();
// QName を定義
String targetNamespace = "http://soapinterop.org/";
QName serviceName = new QName( targetNamespace, "SimpleTest" );
QName portName = new QName( targetNamespace, "SimpleTestSoap" );
QName operationName = new QName( "http://soapinterop.org/",
"echoStruct" );
// サービスを作成
Service service = factory.createService( serviceName );
TypeMappingRegistry registry = service.getTypeMappingRegistry();
TypeMapping mapping = registry.getTypeMapping(
SOAPConstants.URI_NS_SOAP_ENCODING );
mapping.register( SOAPStruct.class,
new QName( "http://soapinterop.org/xsd", "SOAPStruct" ),
new SOAPStructCodec(),
new SOAPStructCodec() );
// 呼び出しを作成
Call call = service.createCall();
// ポートとオペレーション名を設定
call.setPortTypeName( portName );
call.setOperationName( operationName );
call.addParameter( "inputStruct",
new QName( "http://soapinterop.org/xsd", "SOAPStruct" ),
ParameterMode.IN);
call.setReturnType(
new QName( "http://soapinterop.org/xsd", "SOAPStruct" ) );
// エンド ポイント アドレスを設定
call.setTargetEndpointAddress(
"http://www.mssoapinterop.org/asmx/simple.asmx" );
SOAPStruct s = new SOAPStruct();
s.setVarInt(2);
s.setVarString("foo");
s.setVarFloat(123123);
System.out.println(s.toString());
SOAPStruct res = (SOAPStruct) call.invoke(new Object[]{s} );
System.out.println( res );
}
}
J2ME (Java 2 Platform, Micro Edition) Web サービス固有クライアント JAR ファイルを作成して、J2ME で実行されるクライアント アプリケーションと併用することができます。
注意 :BEA は、CDC と Foundation プロファイルの J2ME 環境をサポートしています。
Web サービスを呼び出す J2ME クライアント アプリケーションの作成方法は、非 J2ME クライアントの作成方法とほとんど同じです。 たとえば、同じ実行時クライアント JAR ファイルを非 J2ME クライアント アプリケーションとして使用します (WL_HOME
/server/lib/webserviceclient.jar
)。
J2ME クライアント アプリケーションを記述するには、「Web サービスを呼び出す Java クライアント アプリケーションの作成 : 主な手順」の手順を行いますが、以下の変更点があります。
clientgen
Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成するときは、次の例に示すように、必ず、j2me="True"
属性を指定する。
<clientgen wsdl="http://example.com/myapp/myservice.wsdl"
packageName="myapp.myservice.client"
clientJar="myapps/myService_clients.jar"
j2me="True"
/>
注意 :clientgen
で生成された J2ME Web サービス固有クライアント JAR ファイルは、次の点で JAX-RPC 仕様には適合していません。
J2ME についての詳細は、http://java.sun.com/j2me/ を参照してください。
WebLogic Server では、SSL を使用する J2ME クライアント アプリケーションを作成できます。SSL を使用する J2ME クライアントを記述する場合は、「J2ME クライアントを記述する」で示したガイドラインに加え、以下のガイドラインにも従ってください。