ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS を使用した Web サービス入門
11g リリース 1 (10.3.1)
B55565-01
  目次
目次

戻る
戻る
 
次へ
次へ

6 Web サービスの呼び出し

この章では、WebLogic Web サービスを呼び出す方法について説明します。

Web サービスの呼び出しの概要

Web サービスの呼び出しは、クライアント アプリケーションが Web サービスを使用するために実行するアクションです。Web サービスを呼び出すクライアント アプリケーションは、Java、Microsoft .NET などの任意のテクノロジを使用して記述できます。

クライアント アプリケーションには以下の 2 種類があります。

以降の節では、JAX-WS 仕様の Oracle の実装を使用して、Java クライアント アプリケーションから Web サービスを呼び出す方法について説明します。この実装を使用することで、WebLogic および非 WebLogic にかかわらず任意のアプリケーション サーバで実行されている Web サービスを呼び出すことができます。さらには、スタンドアロン クライアント アプリケーションまたは WebLogic Server の一部として実行されるクライアント アプリケーションのどちらも作成できます。

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] ノードを展開してください。

この節で説明されているコマンドライン ツールのほかに、Web サービス プロキシの生成とテストするために Oracle JDeveloper または Oracle Enterprise Pack for Eclipse (OEPE) のような IDE を使用できます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server Web サービス入門』の「Web サービスをビルドするために Oracle IDE の使用」を参照してください。

スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順

次の表に、Web サービスを呼び出すスタンドアロン クライアントを作成する主な手順をまとめます。「Web サービス呼び出し時のスタンドアロン クライアント JAR ファイルの使用」を参照してください。


注意 :

開発環境でのクライアント アプリケーションのビルドや Java ファイルのコンパイルなどに Ant を使用することを前提としています。また、Web サービスのクライアント タスクで更新する必要のある build.xml ファイルが、すでにあることを想定しています。開発環境での Ant の使用については、「基本的な Ant build.xml ファイルの作成」を参照してください。この節で使用される完全なサンプル build.xml ファイルについては、「スタンドアロン Java クライアントのサンプル Ant ビルド ファイル」を参照してください。

表 6-1 スタンドアロン クライアントから Web サービスを呼び出す手順

#
手順 説明

1

環境を設定する。

コマンド ウィンドウを開いて、ドメイン ディレクトリの bin サブディレクトリにある setDomainEnv.cmd (Windows) または setDomainEnv.sh (UNIX) コマンドを実行する。WebLogic Server ドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameMW_HOME は Oracle 製品の最上位のインストール ディレクトリ、domainName はドメインの名前。

2

build.xml ファイルを更新して、Web サービスの呼び出しに必要なクライアントサイド アーティファクトを生成する clientgen Ant タスクが実行されるようにする。

クライアントのアーティファクトを生成するための clientgen Ant タスクの使用」を参照。

3

Web サービスに関する情報 (そのオペレーションのシグネチャ、ポートの名前など) を取得する。

Web サービスに関する情報の取得」を参照。

4

Web サービス オペレーションを呼び出すためのコードを含むクライアント アプリケーションの Java コードを記述する。

Web サービスを呼び出す Java クライアント アプリケーション コードの記述」を参照。

5

基本の Ant ビルド ファイル build.xml を作成する。

基本的な Ant build.xml ファイルの作成」を参照。

6

Java クライアント アプリケーションをコンパイルし、実行する。

クライアント アプリケーションのコンパイルと実行」を参照。


クライアントのアーティファクトを生成するための clientgen Ant タスクの使用

clientgen WebLogic Web サービス Ant タスクは、クライアント アプリケーションが WebLogic Web サービスと非 WebLogic Web サービスの両方の呼び出しに使用できるクライアント アーティファクトを既存の WSDL ファイルから生成します。以下のようなアーティファクトがあります。

  • 呼び出しの対象となる特定の Web サービスに対する Service インタフェース実装の Java クラス。

  • JAXB データ バインディング アーティファクト。

  • WSDL ファイルで指定されたユーザ定義 XML スキーマ データ型の Java クラス。

clientgen Ant タスクの詳細 (使用可能なすべての属性など) については、『Oracle Fusion Middleware WebLogic Oracle WebLogic Server 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 Fusion Middleware Oracle WebLogic Server 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 タスクによって生成されたファイルやアーティファクトを確認します。

Web サービスに関する情報の取得

オペレーションを呼び出す 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 サービスに buysell の 2 つのオペレーションがあることを示しています (わかりやすくするため、WSDL の関連部分のみを記載しています)。

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

Web サービスを呼び出す Java クライアント アプリケーション コードの記述

次のサンプル コードでは、スタンドアロン アプリケーションが Web サービス オペレーションを呼び出しています。アプリケーションは、標準 JAX-WS API コードと、clientgen によって生成された Service インタフェースの Web サービス固有の実装を使用して、Web サービスのオペレーションを呼び出します。

このサンプルでは、ユーザ定義のデータ型 (examples.webservices.simple_client.BasicStruct) を入力パラメータおよび戻り値として使用するオペレーションを呼び出す方法も示します。clientgen Ant タスクによって、このユーザ定義のデータ型の Java コードが自動的に生成されます。

<clientgen> packageName 属性はクライアント アプリケーションと同じパッケージ名に設定されているため、<clientgen> 生成ファイルをインポートする必要はありません。

package examples.webservices.simple_client;
/**
 * ComplexService Web サービスの echoComplexType オペレーションを呼び出す
 * 簡単なスタンドアロンのクライアント アプリケーション
 */
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.xmlrun ターゲットを追加します。次に例を示します。

<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 クライアントのサンプル Ant ビルド ファイル

次の例では、スタンドアロン 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>

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

WebLogic Web サービス内からの Web サービスの呼び出しは、「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」で説明したスタンドアロン Java アプリケーションからの Web サービスの呼び出しに似ていますが、以下の点が異なります。

この節では、Web サービスを Java EE コンポーネント内のクライアントから呼び出す場合と、スタンドアロン クライアントから呼び出す場合の違いについて説明します。ここでは、読者がすでに「スタンドアロン クライアントからの Web サービスの呼び出し : 主な手順」に目を通して理解していることを前提としています。また、開発環境でのクライアント アプリケーションのビルドや Java ファイルのコンパイルなどに Ant を使用していること、および別の Web サービスを呼び出すために更新が必要な Web サービスを構築する build.xml ファイルが、すでにあることを想定しています。

以下のリストでは、クライアント Web サービスのビルドに使用する build.xml ファイルに加える必要のある変更について説明します。このクライアント Web サービスが、別の Web サービスを呼び出すことになります。build.xml ファイルの完全なサンプルについては、「Web サービス クライアントのサンプル build.xml ファイル」を参照してください。

クライアント Web サービスを実装する JWS ファイルに加える必要のある変更は以下のとおりです。JWS ファイルの完全なサンプルについては、「Web サービスを呼び出すサンプル JWS ファイル」を参照してください。

Web サービス クライアントのサンプル build.xml ファイル

次のサンプル 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>

Web サービスを呼び出すサンプル JWS ファイル

次に示すサンプル JWS ファイル (ClientServiceImpl.java) は、ClientService という Web サービスを実装しています。この Web サービスには、ComplexService という Web サービスの echoComplexType オペレーションを順番に呼び出すオペレーションが含まれています。このオペレーションでは、パラメータとしても戻り値としてもユーザ定義データ型 (BasicStruct) を使用します。コードの該当部分を太字で示し、サンプルの後で説明を加えます。

package examples.webservices.service_to_service;
import javax.jws.WebService;
import javax.jws.WebMethod;
// clientgen によって生成され、ComplexService Web サービスによって使用される
// BasicStruct データ型をインポートする
import examples.webservices.complex.BasicStruct;
// ComplexService Web サービスを呼び出すための JAX-WS スタブをインポートする
// 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) 
  {
    // ComplexService を呼び出すために service および port スタブを作成する
    ComplexService test = new ComplexService(); 
    ComplexPortType port = test.getComplexPortTypePort();
    // 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 ファイルをプログラミングする際は、以下のガイドラインに従います。ガイドラインのサンプル コードは、上述のサンプル内では太字で示されています。

  • 呼び出される Web サービスで使用されるユーザ定義データ型をインポートする。このサンプルでは、ComplexServiceBasicStruct 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();
    
  • ComplexServiceechoComplexType オペレーションを、直前にインスタンス化したポートを使用して呼び出す。

    BasicStruct result = port.echoComplexType(input);
    

@WebServiceRef アノテーションを使用した Web サービス参照の定義

@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;
// clientgen によって生成され、ComplexService Web サービスによって使用される
// BasicStruct データ型をインポートする
import examples.webservices.complex.BasicStruct;
// ComplexService Web サービスを呼び出すための JAX-WS インタフェースをインポートする
// 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)
  {
    // ComplexService を呼び出すために service および port スタブを作成する
    ComplexPortType port = service.getComplexPortTypePort();
    // 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 サービスへの参照およびその注入対象の定義に @WebServiceRef アノテーションを使用している。

    @WebServiceRef()
    ComplexService service;
    
  • 次のコードは、Web サービス参照を使用して ComplexPortType スタブ実装のインスタンスを返す方法を示す。

    ComplexPortType port = service.getComplexPortTypePort();
    
  • 次のコードは、ComplexService Web サービスの sayHello オペレーションを呼び出す方法を示す。

    BasicStruct result = port.echoComplexType(input);
    

Web サービス呼び出し時のプロキシ サーバの使用

プロキシ サーバを使用すると、クライアント アプリケーションから、呼び出される Web サービスをホストするアプリケーション サーバ (WebLogic、非 WebLogic いずれでも) へのリクエストをプロキシできます。通常、プロキシ サーバは、アプリケーション サーバがファイアウォールの内側にある場合に使用します。Java システム プロパティを使用するクライアント アプリケーションでプロキシ サーバを指定することができます。

プロキシ サーバの指定にシステム プロパティを使用する場合は、クライアント アプリケーションの記述は標準的な方式で行い、クライアント アプリケーションの実行時に以下のシステム プロパティを指定します。

次の表に、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>

Web サービス呼び出し時のスタンドアロン クライアント JAR ファイルの使用

このマニュアルでは、clientgen または wsdlc Ant タスクによって生成されたクライアントサイド アーティファクトを使用して Web サービスを呼び出す場合、CLASSPATH には WebLogic Server クラスのセット全体が入るということが前提となっています。ただし、お使いのコンピュータに WebLogic Server がインストールされていない場合でも、この節で説明するようにスタンドアロンの WebLogic Web サービス クライアント JAR ファイルを使用することで、Web サービスを呼び出すことができます。

スタンドアロン クライアント JAR ファイルは、次のような基本的なクライアントサイドの機能をサポートしています。

スタンドアロンの WebLogic Web サービス クライアント JAR ファイルを、クライアント アプリケーションで使用するには、次の手順に従います。

  1. ファイル WL_HOME/server/lib/wseeclient.zip を、WebLogic Server をホストしているコンピュータからクライアント コンピュータにコピーします。WL_HOME は、WebLogic Server のインストール ディレクトリ (/Oracle/Middleware/wlserver_10.3 など) を表します。

  2. wseeclient.zip ファイルを、適切なディレクトリに解凍します。たとえば、クライアント アプリケーションで使用している他のクラスが格納されているディレクトリを解凍先にします。

  3. wseeclient.jar ファイル (wseeclient.zip ファイルから解凍) を、CLASSPATH に追加します。


    注意 :

    また、Ant クラスが含まれる JAR ファイル (ant.jar) が、確実に CLASSPATH に格納されるようにしてください。この JAR ファイルは通常、Ant ディストリビューションの lib ディレクトリ内にあります。

  4. JDK 6 Update 2 を使用している場合、このバージョンの Sun JDK でサポートされるのは JAX-WS 2.0 および JAXB 2.0 の API のみである点に注意する必要があります。このリリースで JDK 6 Update 2 を使用するには、現在の JDK 6 インストールの API JAR をアップデートする必要があります。そのためには、次の手順に従います。

    • 次の JAR を WebLogic Server のインストール ディレクトリから Sun JDK6 の endorsed ディレクトリへコピーします。

      • $MW_HOME/modules/javax.xml.bind_2.1.1 jar から JDK6_HOME/jre/lib/endorsed

      • $MW_HOME/modules/javax.xml.ws_2.1.1 jar から JDK6_HOME/jre/lib/endorsed

    • Java 承認ライブラリを使用して、既存の JDK 6 Update 2 ライブラリ ファイルをオーバーライドします。http://java.sun.com/javase/6/docs/technotes/guides/standards にある「Java Endorsed Standards Override Mechanism」を参照してください。

Web サービスを再デプロイする際にクライアント側で考慮すべき事項

WebLogic Server ではプロダクションの再デプロイメントをサポートしています。つまり、更新後の新しいバージョンの WebLogic Web サービスを同じ Web サービスの古いバージョンと並行してデプロイできます。

WebLogic Server では、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでに Web サービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続けます。作業が完了した時点で、自動的に古い Web サービスが廃止されます。

Web サービスの新しいバージョンで以下の Web サービス アーティファクトが変更されていなければ、その新しいバージョンで古いクライアント アプリケーションを引き続き使用できます。

上記のアーティファクトのいずれかが変更されている場合、clientgen Ant タスクを再び実行して、クライアント アプリケーションで使用される JAX-WS スタブを再生成する必要があります。

たとえば、Web サービスの新しいバージョンでオペレーションのシグネチャを変更すると、Web サービスの新しいバージョンを記述する WSDL ファイルも変更されます。この場合、JAX-WS スタブを再生成する必要があります。ただし、単にオペレーションの実装だけを変更し、オペレーションのパブリック コントラクトは変更しない場合、既存のクライアント アプリケーションを引き続き使用できます。