Menu Close

25.2. Service オブジェクトの作成

概要

javax.xml.ws.Service クラスは、サービスを公開するすべてのエンドポイントの定義が含まれる wsdl:service 要素を表します。そのため、サービス上でリモート呼び出しを行うプロキシーである wsdl:port 要素によって定義されるエンドポイントを取得できる手段を提供します。

注記

Service クラスは、クライアントコードが XML ドキュメントではなく Java 型と動作できるようにする抽象化を提供します。

create() メソッド

Service クラスには、新しい Service オブジェクトの作成に使用できる静的 create() メソッドが 2 つあります。例25.1「Service create() メソッド」に示すように、create() メソッドの両方は Service オブジェクトが表す wsdl:service 要素の QName を取得し、1 つは WSDL コントラクトの場所を指定する URI を取得します。

注記

すべてのサービスが WSDL コントラクトを公開します。SOAP/HTTP サービスの場合、URI は通常 ?wsdl が追加されたサービスの URI になります。

例25.1 Service create() メソッド

public staticServicecreateURLwsdlLocationQNameserviceNameWebServiceExceptionpublic staticServicecreateQNameserviceNameWebServiceException

serviceName パラメーターの値は QName です。namespace 部分の値は、サービスのターゲット namespace です。サービスのターゲット namespace は、@WebService アノテーションの targetNamespace プロパティーで指定されます。QName のローカルパートの値は、wsdl:service 要素の name 属性の値です。この値は、以下のいずれかの方法で決定できます。 .これは、@WebService アノテーションの serviceName プロパティーで指定されます。

  1. Service@WebService アノテーションの name プロパティーの値に追加する。
  2. Service を SEI の名前に追加する。
重要

OSGi 環境にデプロイされたプログラムで作成された CXF コンシューマーは、ClassNotFoundException が発生する可能性を回避するために特別な処理を必要とします。プログラムで作成された CXF コンシューマーが含まれる各バンドルについて、シングルトン CXF デフォルトバスを作成し、すべてのバンドルの CXF コンシューマーがそれを使用するようにする必要があります。このセーフガードがなければ、あるバンドルが別のバンドルで作成された CXF デフォルトバスに割り当てられる可能性があり、これによりバンドルの継承に失敗する可能性がありました。

たとえば、バンドル A が CXF デフォルトバスを明示的に設定せず、バンドル B で作成した CXF デフォルトバスが割り当てられているとします。バンドル A の CXF バスに追加の機能 (SSL や WS-Security など) を設定する必要がある場合や、バンドル A のアプリケーションから特定のクラスやリソースを読み込む必要がある場合、これに失敗します。これは、CXF バスインスタンスが、スレッドコンテキストクラスローダー (TCCL) を、作成したバンドル (この場合はバンドル B) のバンドルクラスローダーとして設定するためです。さらに、wss4j (CXF で WS-Security を実装する) などの特定のフレームワークは、TCCL を使用して、コールバックハンドラークラスやその他のプロパティーファイルなどのリソースをバンドル内から読み込みます。バンドル A はバンドル B のデフォルト CXF バスおよびその TCCL に割り当てられていため、wss4j レイヤーはバンドル A から必要なリソースを読み込みできず、ClassNotFoundException エラーが発生します。

シングルトン CXF のデフォルトバスを作成するには、以下のコードを挿入します。

BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());

このコードは、「例」 のように、サービスオブジェクトを作成する main メソッドの先頭に挿入します。

例25.2「Service オブジェクトの作成」に、例24.7「すべてのアノテーションが付けられた SEI」に記載されている SEI の Service オブジェクトを作成するコードを示します。

例25.2 Service オブジェクトの作成

package com.fusesource.demo;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class Client
{
public static void main(String args[])
  {
    BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());
    QName serviceName = new QName("http://demo.redhat.com", "stockQuoteReporter");
    Service s = Service.create(serviceName);
   ...
  }
}

例25.2「Service オブジェクトの作成」のコードは、以下を行います。

サービスのすべての CXF コンシューマーで利用できるシングルトン CXF デフォルトバスを作成する。

@WebService アノテーションの targetNamespace プロパティーと name プロパティーを使用して、サービスの QName をビルドする。

単一のパラメーター create() メソッドを呼び出して、新しい Service オブジェクトを作成する。

注記

単一のパラメーター create() を使用すると、WSDL コントラクトへのアクセスに依存関係が不要になります。