ナビゲーションをスキップ

WebLogic Web サービス プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

クライアント アプリケーションおよび WebLogic Server からの Web サービスの呼び出し

この章では、クライアント アプリケーションおよび WebLogic Server から WebLogic および非 WebLogic の Web サービスを呼び出す方法について説明します。

信頼性のある SOAP メッセージングを使用して WebLogic Web サービスを呼び出す方法については、「信頼性のある SOAP メッセージングの使い方」を参照してください。

この章では、クライアント アプリケーションから WebLogic Web サービスを呼び出すときに接続プロトコルとして HTTP/S が使用されるものとします。しかし、それ以外にも、クライアント アプリケーションからの Web サービスの呼び出しに JMS も使用するように、Web サービスをコンフィグレーションすることができます。詳細については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。

 


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 ファイルを生成できます。これらのスタブは、StubService などの JAX-RPC インタフェースを実装します。

Web サービスの呼び出し時に生じた問題のトラブルシューティングについては、「トラブルシューティング」を参照してください。

JAX-RPC API 1.0

JAX-RPC (Java API for XML-based RPC) は、Web サービス API を定義する Sun Microsystems の仕様です。

次の表で、JAX-RPC の中心的なインタフェースとクラスを簡単に説明します。

表 7-1 JAX-RPC のインタフェースとクラス

javax.xml.rpc のインタフェースまたはクラス

説明

Service

主要なクライアント インタフェース。

ServiceFactory

Service インスタンスの生成に使用するファクトリ クラス。

Stub

Web サービスのオペレーションを呼び出すためのクライアント プロキシの基本クラス。

Call

Web サービスを動的に呼び出すのに使用する。

JAXRPCException

Web サービスの呼び出し中にエラーが発生した場合に送出される例外。

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」を参照してください。

実行時クライアント JAR ファイル

WebLogic Server には、スタンドアロン クライアント アプリケーション (WebLogic Server インスタンス内で実行されていないクライアント アプリケーション) で使用するための、次の実行時クライアント JAR ファイルが付属しています。これらの JAR ファイルは、WL_HOME/server/lib ディレクトリにあります。WL_HOME は、WebLogic Platform の最上位のディレクトリです。

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 サイト」を参照してください。

Web サービスを呼び出すクライアントの例

WebLogic Server の WL_HOME/samples/server/src/examples/webservices ディレクトリには、WebLogic Web サービスの作成および呼び出しの方法として次の例があります。WL_HOME は、WebLogic Platform のメイン ディレクトリです。

上記の例の構築と実行についての詳細な説明は、次の Web ページを参照してください。

WL_HOME/samples/server/src/examples/webservices/package-summary.html

 


Web サービスを呼び出す Java クライアント アプリケーションの作成 : 主な手順

Web サービスを呼び出す Java クライアント アプリケーションを作成するには、次の手順に従います。

  1. clientgen Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成します。
  2. WebLogic または非 WebLogic サーバのいずれかでホストされる Web サービス用のクライアント JAR ファイルを作成する場合は、wsdl 属性を指定します。EAR ファイルにパッケージ化されている WebLogic Web サービス用の場合は、ear 属性を指定します。

    clientgen Ant タスク実行の詳細および例については、「clientgen Ant タスクを実行してクライアント JAR ファイルを生成する」を参照してください。リファレンス情報については、「Web サービス Ant タスクとコマンドライン ユーティリティ」を参照してください。

  3. Web サービスに関する情報 (名前やシグネチャなど) を取得します。
  4. 詳細については、「Web サービスについての情報を取得する」を参照してください。

  5. Web サービスの呼び出しを含む Java クライアント アプリケーションのコードを記述します。
  6. 簡単なクライアント アプリケーションを記述する例については、「Web サービスを呼び出す Java クライアント アプリケーションを作成する」を参照してください。

  7. Java クライアント アプリケーションをコンパイルし、実行します。
  8. スタンドアロン クライアント アプリケーションを作成する場合は、WebLogic Server に付属の webserviceclient.jar 実行時 Java クライアント JAR ファイルを必ずアプリケーションの CLASSPATH に含めてください。詳細については、「実行時クライアント JAR ファイル」を参照してください。

    クライアント アプリケーションを WebLogic Server で実行している場合は、この実行時クライアント JAR ファイルは必要ありません。

clientgen Ant タスクを実行してクライアント JAR ファイルを生成する

Web サービス固有の JAR ファイルには、Stub および Service インタフェースの実装などのスタブが含まれます。これらのスタブは JAX-RPC 仕様で定義されているもので、クライアント アプリケーションが Web サービス (WebLogic、非 WebLogic に関係なく) を呼び出すときに使用されます。必要なコードのほとんどすべてが自動的に生成されます。

注意 :クライアント機能に関する BEA の現在のライセンスの詳細については、「BEA eLicense Web サイト」を参照してください。

clientgen Ant タスクを実行し、Web サービス固有のクライアント JAR ファイルを自動的に生成するには、次のように行います。

  1. 環境を設定します。
  2. 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 はドメインの名前です。

  3. clientgen Ant タスクの呼び出しの入った build.xml というファイルを作成します。詳細については、この節で以下に説明する例を参照してください。
  4. build.xml ファイルと同じディレクトリで ant と入力し、Ant タスクまたは build.xml ファイルで指定されたタスクを実行します。
  5. 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 サービスの名前とオペレーションのシグネチャを知る必要があります。Web サービスに関する情報を調べるにはさまざまな方法があります。

WebLogic Web サービスを呼び出す場合は、そのホーム ページを使用して各オペレーションの完全なシグネチャを取得できます。詳細については、「Web サービスのホーム ページを使用した Web サービスのテスト」を参照してください。

Web サービス オペレーションのシグネチャを取得する 2 番目の方法は、clientgen Ant タスクを使用して、Web サービス固有のクライアント JAR ファイルを生成し、次にそれを unJAR して、生成された *.java ファイルを調べる方法です。通常、ServiceNamePort.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 サービスには、buysell の 2 つのオペレーションがあることを示しています (わかりやすくするため、WSDL の関連部分のみを記載しています)。

  <binding name="TraderServiceSoapBinding" ...>
...
<operation name="sell">
...
</operation>
<operation name="buy">
</operation>
</binding>

Web サービスを呼び出す Java クライアント アプリケーションを作成する

この節では、Web サービスを呼び出す Java クライアント アプリケーションを記述する方法について説明します。以降の例では、JAX-RPC API を使用し、BEA が提供する必要な JAR ファイルが CLASSPATH に追加されていることを前提としています。

簡単なクライアント アプリケーションを記述する

静的クライアント アプリケーションを使用して Web サービスを呼び出すときは、タイプ分けされた Java インタフェースを使用します。Web サービス固有の JAR ファイルには、次のクラスとインタフェースが入っています。

次のコードは、サンプルの 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);
}
}

上記の例で注目すべき点は以下のとおりです。

out または inout パラメータを使用するクライアントを記述する

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 ベースのクライアント アプリケーションで使用することはできません。

非同期クライアントを記述するには、次の手順に従います。

  1. clientgen Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成します。次の例に示すように、generateAsyncMethods="True" 属性を必ず指定してください。
  2. <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 タスクとコマンドライン ユーティリティ」を参照してください。

  3. 特化された非同期メソッドを使用して Java コードを記述します。例については、「非同期クライアントの Java コードを記述する」を参照してください。
  4. 非同期 Java クライアント アプリケーションをコンパイルし、実行します。
  5. スタンドアロンの非同期クライアント アプリケーションを作成する場合は、WebLogic Server に付属の webserviceclient.jar 実行時 Java クライアント JAR ファイルを必ずアプリケーションの CLASSPATH に含めてください。クライアント アプリケーションが WebLogic Server で実行されている場合 (信頼性のある SOAP メッセージング フレームワークの要素としてなど)、この手順は省略することができます。

    webserviceclient.jar ファイルおよびその他の使用可能な実行時クライアント JAR ファイルの詳細については、「実行時クライアント JAR ファイル」を参照してください。

非同期クライアント アプリケーションの記述についての詳細な API リファレンスは、weblogic.webservice.asyncJavadoc を参照してください。

非同期 Web サービス クライアントに生成されるスタブの説明

clientgen Ant タスクの実行時に generateAsyncMethods="True" を指定すると、生成される JAX-RPC スタブに、2 つの特殊なメソッドが作成されます。このメソッドは、標準メソッドに加えて、各 Web サービス オペレーションを非同期に呼び出すときに使用します。この特殊なメソッドは、次のような形式になっています。

FutureResult startMethod (params, AsyncInfo asyncInfo);
result endMethod (FutureResult futureResult);

各要素の説明は次のとおりです。

注意 :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 を参照してください。

非同期クライアントの Java コードを記述する

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 );

この例では、endMethod() メソッドは 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 );

 


Web サービスのシステム プロパティの使い方

次の 2 つの表に、Web サービスを呼び出すクライアント アプリケーションで設定できる WebLogic および標準の JDK 1.4 のシステム プロパティを示します。プロパティの設定には System.setProperty() メソッドを使用します。

表 7-2 WebLogic Web サービスのシステム プロパティ

Web サービスのシステム プロパティ

説明

データ型

weblogic.webservice.transport.http.full-url

HTTP リクエストの Request-URI フィールドに指定され、クライアント アプリケーションが呼び出す Web サービスの完全な URL (相対 URL ではない) を指定する。

有効な値は True および False。デフォルト値は False

Boolean

weblogic.webservice.transport.https.proxy.host

プロキシ サーバを使用して HTTPS (HTTP over SSL) 接続を行う場合は、クライアント アプリケーションで、このシステム プロパティを使用してプロキシ サーバのホスト名を指定する。

String

weblogic.webservice.transport.https.proxy.port

プロキシ サーバを使用して HTTPS (HTTP over SSL) 接続を行う場合は、クライアント アプリケーションで、このシステム プロパティを使用してプロキシ サーバのポートを指定する。

String

weblogic.webservice.verbose

Web サービスの呼び出し時に verbose モードを有効にして、クライアントの標準出力に SOAP リクエストおよび SOAP 応答メッセージを表示できるようにする。

有効な値は True および False。デフォルト値は False

詳細については、「SOAP メッセージの表示」を参照。

Boolean

weblogic.webservice.client.ssl.strictcertchecking

WebLogic 提供の SSL 実装を使用する場合に厳密な証明書検証を有効または無効にする。

True に設定すると厳密な証明書検証が有効になり、False では無効になる。デフォルト値は True

例については、「WebLogic Server が提供する SSL 実装を使用する」を参照。

Boolean

weblogic.webservice.client.ssl.trustedcertfile

認証局 (Certificate Authority: CA) の証明書が格納されている、クライアント アプリケーションのコンピュータに配置されたファイルの名前。このファイルに証明書のある CA は、信頼を受けて WebLogic Server 証明書の発行が任されている。このファイルには、ユーザ自身が信頼する証明書も格納できる。

String

weblogic.webservice.client.ssl.adapterclass

サードパーティの SSL 実装を使用するために実装されたアダプタ クラスの完全修飾名。

例については、「サードパーティの SSL 実装を使用する」を参照。

String

weblogic.webservice.security.clock.precision

Web サービスを呼び出すクライアント アプリケーションと WebLogic Server のクロックの同期の精度を記述する。クライアント アプリケーションは、この値を使用して 2 つのクロック間のスキューの妥当なレベルを計算する。

この値は、ミリ秒単位で指定する。たとえば、クロックの精度が 1 分以内である場合、60000 を指定する。

この要素の値が SOAP 応答の有効期限を上回る場合、クライアント アプリケーションは有効期限を正確に適用できないのでリクエストを拒否する。たとえば、クロック精度値が 60000 ミリ秒で、クライアント アプリケーションが受信する SOAP メッセージの有効期限が 30000 ミリ秒の場合、60000 ミリ秒のクロック精度との不一致のため、メッセージの存続期間は 30000 ミリ秒を超えることができる。このため、クライアント アプリケーションはメッセージを拒否する。この厳しい指定を緩めるには、weblogic.webservice.security.clock.precision.lax プロパティを false に設定する。

このプロパティは、weblogic.webservice.security.clock.synchronized と一緒に指定する必要がある。

このプロパティのデフォルト値は 60000。

Integer

weblogic.webservice.security.clock.precision.lax

クロック精度期間を適用するかどうかを指定する。

この要素を true に設定した場合、クライアント アプリケーションは、weblogic.webservice.security.clock.precision プロパティで指定したクロック精度期間より有効期限が短い SOAP 応答を拒否しない。デフォルトでは、クライアント アプリケーションはこれらの SOAP 応答を拒否する。これは、クライアント アプリケーションと WebLogic Server 間のクロック精度の不一致のため、クライアント アプリケーションはメッセージが期限切れになったかどうかを判断できないからである。

このプロパティの有効な値は、True および False。デフォルト値は false

Boolean

weblogic.webservice.security.clock.synchronized

クライアント アプリケーションが SOAP メッセージのタイムスタンプを処理するときに、Web サービスを呼び出すクライアント アプリケーションのクロックと WebLogic Server のクロックが同期していると見なすかどうかを指定する。

このプロパティの値が true の場合、クライアント アプリケーションは WebLogic Server からの SOAP 応答の有効期限を適用する。false の場合、クライアント アプリケーションは有効期限が指定されている SOAP 応答をすべて拒否する。

このプロパティの有効な値は、True および False。デフォルト値は false

Boolean

weblogic.webservice.security.delay.max

WebLogic Server からクライアント アプリケーションへの SOAP 応答の有効期限をミリ秒単位で指定する。クライアント アプリケーションは、このプロパティを SOAP 応答のタイムスタンプの作成日に追加し、クロック精度を計算し、結果を現在の時刻と比較する。結果が現在時刻より大きい場合、クライアント アプリケーションは応答を拒否する。

SOAP 応答の有効期限に加え、クライアント アプリケーションは WebLogic Server によって指定された SOAP 応答メッセージ自体の有効期限も考慮する。

有効期限を指定しない場合は、このプロパティを -1 に設定する。

このプロパティのデフォルト値は -1

このプロパティを設定する場合、weblogic.webservice.security.clock.synchronized プロパティを true に設定して、WebLogic Server とクライアント アプリケーションのクロックが同期されていることを指定する必要がある。

Integer

weblogic.webservice.security.timestamp.include

クライアント アプリケーションが WebLogic Web サービス オペレーションの SOAP リクエストにタイムスタンプを追加するかどうかを指定する。

このプロパティの有効な値は、True および False。デフォルト値は true

Boolean

weblogic.webservice.security.timestamp.require

クライアント アプリケーション側が、WebLogic Server からの SOAP 応答にタイプスタンプが指定されていることを必要とするかどうかを指定する。このプロパティを true に設定し、SOAP 応答にタイムスタンプが含まれていない場合、クライアント アプリケーションは応答を拒否する。

このプロパティの有効な値は、True および False。デフォルト値は true

Boolean

weblogic.webservice.security.validity

クライアント アプリケーションが SOAP リクエストのタイムスタンプ ヘッダに追加する有効期限をミリ秒単位で指定する。

有効期限を指定しない場合は、このプロパティを -1 に設定する。

このプロパティのデフォルト値は -1

Integer

次の表に、クライアント アプリケーションで設定できる標準の JDK 1.4 のシステム プロパティを示します。

これらのプロパティの詳細については、Sun の「Networking Properties」を参照してください。

表 7-3 標準の JDK 1.4 のシステム プロパティ

標準の JDK 1.4 のシステム プロパティ

説明

http.proxyHost

プロキシ サーバを使用して HTTP 接続を行う場合は、クライアント アプリケーションでプロキシ サーバのホスト名を指定する。

http.proxyPort

プロキシ サーバを使用して HTTP 接続を行う場合は、クライアント アプリケーションでプロキシ サーバのポートを指定する。

http.nonProxyHosts

プロキシ サーバを使用して HTTP 接続を行う場合に、プロキシ サーバを経由せずに直接接続する必要のあるホストを指定する。

networkaddress.cache.ttl

java.security で使用し、ネーム サービスで成功した名前のルックアップに対するキャッシュ ポリシーを指定する。この値には、成功したルックアップをキャッシュする秒数を整数で指定する。

networkaddress.cache.negative.ttl

java.security で使用し、ネーム サービスで失敗した名前のルックアップに対するキャッシュ ポリシーを指定する。この値には、失敗したルックアップをキャッシュする秒数を整数で指定する。

http.agent

HTTP リクエストで送信された User-Agent リクエスト ヘッダを指定する。

http.auth.digest.validateServer

HTTP ダイジェスト認証メカニズムの動作を変更する。このシステム プロパティを True に設定すると、クライアント アプリケーションに対するサーバの自己認証が強制される。

http.auth.digest.validateProxy

HTTP ダイジェスト認証メカニズムの動作を変更する。このシステム プロパティを True に設定すると、クライアント アプリケーションに対するプロキシ サーバの自己認証が強制される。

http.auth.digest.cnonceRepeat

cnonce 値を再利用する回数を指定して、HTTP ダイジェスト認証メカニズムの動作を変更する。

http.keepAlive

キープ アライブ接続 (永続的な接続) をサポートするかどうかを指定する。

http.maxConnections

1 つの接続先に対して、キープ アライブ状態を同時に保持できるアイドル接続数を指定する。このシステム プロパティは、http.keepAlive とともに使用する。

https.sharedsocket

WebLogic の SSL 実装を使用して WebLogic Web サービスに接続する SSL クライアント アプリケーションでソケットの共有を有効にする。

有効な値は True および False。デフォルト値は False

詳細については、「WebLogic の SSL 実装使用時の SSL ソケット共有の使用」を参照。

https.sharedsocket.timeout

共有ソケットのタイムアウト値 (秒単位) を指定する。

デフォルト値は 15 秒。

詳細については、「WebLogic の SSL 実装使用時の SSL ソケット共有の使用」を参照。

 


WebLogic Server からの WebLogic Web サービスの呼び出し

WebLogic Server にデプロイされた EJB やサーブレットなどのコンポーネントからの Web サービスの呼び出しは、スタンドアロン クライアントからの Web サービスの呼び出しと本質的には同じです。この章の例で示したコードと同じものを記述し、同じ方法で clientgen を使用して Web サービス固有のクライアント JAR ファイルを生成します。主な違いは以下のとおりです。

次の表に、Web サービスを呼び出すクライアント アプリケーションのタイプと、それに対応する各種クライアント JAR ファイルの場所を示します。

表 7-4 クライアント アプリケーションのタイプとクライアント JAR ファイルの場所

クライアント アプリケーションのタイプ

実行時クライアント JAR ファイルの場所

Web サービス固有クライアント JAR ファイルの場所

スタンドアロン

クライアントの CLASSPATH

クライアントの CLASSPATH

EJB

WebLogic Server 実行時システムに実行時クライアント クラスが含まれるため不要

EJB JAR ファイル

サーブレットまたは Java クラス

WebLogic Server 実行時システムに実行時クライアント クラスが含まれるため不要

WAR ファイルの WEB-INF/lib ディレクトリ

ポータブル スタブの作成と使い方

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 にデプロイされ実行されている場合です。クライアント アプリケーションがスタンドアロンの場合は、必要ありません。

クライアント アプリケーションでポータブル スタブを使用可能にする方法を、以下に示します。

  1. クライアント アプリケーションにおいて、一般的な webserviceclient.jar クライアント JAR ファイルではなく、wsclient81.jar (WebLogic Server とともに WL_HOME/server/lib ディレクトリに配布) と呼ばれる WebLogic Server の各リリースに固有のクライアント JAR ファイルを使用します。wsclient81.jar ファイルには、標準のクライアント JAR ファイルと同じクラス ファイルを weblogic81.* というファイル名に変更したものが含まれています。これらのクラス ファイルはバージョンごとに固有のため、WebLogic Server の weblogic.* クラスと衝突することはありません。
  2. clientgen Ant タスクで生成した Web サービス固有のクライアント JAR ファイルだけでなく、サポートするすべてのクライアント JAR ファイルを VersionMaker ユーティリティを介して実行します。このユーティリティを使用すると、クライアント JAR ファイルのクラスが以下のように変更されます。
    • すべての weblogic.* クラスの名前が weblogic81.* に変更される。
    • すべての weblogic.* クラスへの参照が weblogic81.* への参照に変更される。

    こうして変更された新しいバージョン固有のクライアント JAR ファイルを、クライアント アプリケーションで使用します。

    VersionMaker の使用方法の詳細については、「VersionMaker ユーティリティを使用したクライアント JAR ファイルの更新」を参照してください。

VersionMaker ユーティリティを使用したクライアント JAR ファイルの更新

クライアント JAR ファイルを更新して、バージョン固有の WebLogic Server クラスを使用するには、以下の手順に従います。

  1. 環境を設定します。
  2. 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 はドメインの名前です。

  3. Java ユーティリティ weblogic.webservice.tools.versioning.VersionMaker を実行し、次のパラメータを渡します。
    • destination_dir : 新しいバージョン固有のクライアント JAR ファイルを含む送り先ディレクトリ。
    • client_jar_file : clientgen Ant タスクで生成したクライアント JAR ファイルで、クラス ファイル名を weblogic.* から weblogic81.* に変更する必要があるもの。
    • other_jar_files : サポートする JAR ファイル。

    次に例を示します。

    java weblogic.webservice.tools.versioning.VersionMaker \
    new_directory myclient.jar supporting.jar

    この例では、myclient.jar および supporting.jar というクライアント JAR ファイルの weblogic.* クラスを weblogic81.* という名前に変更し、それらのクラスへの参照をすべて更新しています。カレント ディレクトリ内の new_directory というディレクトリに、新しいクライアント JAR ファイルが生成されます。

 


WebLogic Web サービス クライアントでのプロキシ サーバの使用

プロキシ サーバを使用すると、WebLogic Web サービス クライアント アプリケーションから、Web サービスをホストするサーバ (WebLogic、非 WebLogic いずれでも) へのリクエストをプロキシできます。ただし、クライアント アプリケーションの以下のシステム プロパティを必ず設定してください。

注意 :Web サービスを呼び出すときに、転送に HTTPS を使用している場合は、前述のプロパティにおける httphttps に置き換えます。たとえば、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 を参照してください。

 


高度な Java クライアント アプリケーションの記述

以下の節では、高度なクライアント アプリケーションを記述する例について説明します。

WSDL を使用する動的クライアントを記述する

たとえば、組み込みデータ型と WSDL を使用して次の URL にある Web サービスを呼び出す動的クライアント アプリケーションを作成するとします。

http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl

この Java コードを記述するには、次の手順に従います。

  1. ServiceFactory.newInstance() メソッドを使用してサービス ファクトリを作成します。
  2. このファクトリから Service オブジェクトを作成し、WSDL と呼び出す Web サービスの名前を渡します。
  3. Service から Call オブジェクトを作成し、ポート名と実行するオペレーションを渡します。
  4. Call.invoke() メソッドを使用して、Web サービス オペレーションを実際に呼び出します。

注意 :動的なクライアント アプリケーションから呼び出す 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 にある情報を明示的に設定する必要があります。

次の例は、クライアント アプリケーションで 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 サービスを呼び出す動的クライアントを記述するときは、次の処理も行う必要があります。

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 クライアントを記述する

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 クライアント アプリケーションの作成 : 主な手順」の手順を行いますが、以下の変更点があります。

J2ME についての詳細は、http://java.sun.com/j2me/ を参照してください。

SSL を使用する J2ME クライアントを記述する

WebLogic Server では、SSL を使用する J2ME クライアント アプリケーションを作成できます。SSL を使用する J2ME クライアントを記述する場合は、「J2ME クライアントを記述する」で示したガイドラインに加え、以下のガイドラインにも従ってください。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次