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

概要

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

注記

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

The create() メソッド

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

注記

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

例25.1 Service create() メソッド

public staticServicecreateURLwsdlLocationQNameserviceNameWebServiceExceptionpublic staticServicecreateQNameserviceNameWebServiceException

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

  1. @WebService アノテーションの name プロパティーの値に Service を追加します。
  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 を使用して、バンドル内から calback ハンドラークラスやその他のプロパティーファイルなどのリソースをロードします。バンドル A はバンドル B のデフォルト CXF バスおよびその TCCL に割り当てられていため、wss4j レイヤーはバンドル A から必要なリソースを読み込みできず、ClassNotFoundException エラーが発生します。

シングルトン CXF デフォルトバスを作成するには、「例」 に示すように、サービスオブジェクトを作成するメソッドの開始点に、main のコードを挿入します。

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

例25.2「Serivce オブジェクトの作成」に、例24.7「完全に注釈が付けられた SEI」 に記載されている SEI の Service オブジェクトを作成するコードを示します。

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

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「Serivce オブジェクトの作成」 のコードは、以下を行います。

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

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

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

注記

single パラメーター create() を使用すると、WSDL コントラクトへのアクセス時に依存関係が解放されます。