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 staticService
create
URL
wsdlLocation
QName
serviceName
WebServiceExceptionpublic staticService
create
QName
serviceName
WebServiceException
serviceName
パラメーターの値は QName です。namespace 部分の値は、サービスのターゲット namespace です。サービスのターゲット namespace は、@WebService
アノテーションの targetNamespace
プロパティーで指定されます。QName のローカルパートの値は、wsdl:service
要素の name
属性の値です。この値は、以下のいずれかの方法で決定できます。 .これは、@WebService
アノテーションの serviceName
プロパティーで指定されます。
-
Service
を@WebService
アノテーションのname
プロパティーの値に追加する。 -
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 コントラクトへのアクセスに依存関係が不要になります。