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 staticService
create
URL
wsdlLocation
QName
serviceName
WebServiceExceptionpublic staticService
create
QName
serviceName
WebServiceException
serviceName
パラメーターの値は QName です。その名前空間部分の値は、サービスのターゲット名前空間です。サービスのターゲット namespace は、 @WebService
アノテーションの targetNamespace
プロパティーで指定されます。QName の local part の値は、wsdl:service
要素の name
属性の値です。この値は、次のいずれかの方法で決定できます。 .@WebService
アノテーションの serviceName
プロパティーで指定されます。
-
@WebService
アノテーションのname
プロパティーの値にService
を追加します。 -
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 のデフォルトバスを作成するには、以下のコードを挿入します。
BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());
「例」 のように、サービスオブジェクトを作成する main
メソッドの開始時に設定します。
例
例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 コントラクトへのアクセス時に依存関係が解放されます。