JAX-WS
Java™ API for XML-Based Web Services (JAX-WS) は、Java API for XML-based RPC (JAX-RPC) プログラミング・モデルが提供する基盤を補完する、次世代の Web サービス・プログラミング・モデルです。JAX-WS を使用すると、Web サービスとクライアントの開発が容易になり、しかも、動的プロキシーおよび Java アノテーションを使用することにより、プラットフォームからの Java アプリケーションの独立性が向上します。
JAX-WS は、標準的なアノテーション・ベースのモデルをサポートして Web サービス・アプリケーションおよびクライアントを開発することにより、 アプリケーションの開発を簡素化する、プログラミング・モデルです。JAX-WS テクノロジーは、戦略的観点から、より文書中心のメッセージング・モデルを指向する今日の業界傾向に合わせてあり、また、JAX-RPC により定義されたリモート・プロシージャー・コール・プログラミング・モデルに代わるものです。 JAX-RPC プログラミング・モデルとアプリケーションは本製品で引き続きサポートされますが、JAX-RPC には制限があり、多様で複雑な文書中心のサービスはサポートしません。 JAX-WS は Web サービスを開発するための戦略的なプログラミング・モデルであり、Java Platform, Enterprise Edition 6 (Java EE 6) の必要不可欠な部分です。JAX-WS は、JSR 224 とも呼ばれます。
JAX-WS 2.2 仕様は、JAX-WS 2.1 仕様の後発仕様であり、その機能を含みます。JAX-WS 2.2 では、WebServiceFeature 関連の アノテーション (@MTOM、@Addressing、および @RespectBinding アノテーションなど) を使用するためのクライアント・サイドでのサポートが 追加されます。サーバー上でのこれらのアノテーションのサポートは、既に JAX-WS 2.1 から 追加されていました。WSDL 文書に WS-Policy アサーションを追加することにより、クライアントまたはサービスにおける WS-Addressing サポートを有効にし、構成する機能も備わりました。 さらに、Web Services for Java EE 1.3 仕様では、 これら WebServiceFeature 関連のアノテーションのサポートに加え、 これらの機能をクライアントとサーバーの両方に構成するためのデプロイメント記述子 エレメントの使用のサポートも導入されています。 JAX-WS 2.2 は、データ・バインディングのために Java Architecture for XML Binding (JAXB) バージョン 2.2 を必要とします。
JAX-WS プログラミング標準の実装では、Web サービスとクライアントの開発について次の拡張機能を提供しています。
- Java アプリケーションのプラットフォーム独立性の向上。
JAX-WS API を使用すると、Java アプリケーションの向上したプラットフォーム独立性によって、Web サービスとクライアントの開発が簡単になります。 JAX-WS では動的プロキシー・メカニズムを利用して、プラグ可能プロバイダーによる正式な代行モデルを提供します。 これは JAX-RPC に対する機能拡張で、ベンダー固有の呼び出し用スタブの生成に依存します。
- アノテーション
JAX-WS では、その Java クラスが Web サービスであることを示すため、メタデータによる Java クラスのアノテーション付けをサポートしています。JAX-WS は、Metadata Facility for the Java Programming Language (JSR 175) 仕様および Web Services Metadata for the Java Platform (JSR 181) 仕様に基づくアノテーションと、JAX-WS 2.2 仕様で定義されたアノテーションの使用をサポートしています。 Java ソース内および Java クラス内でアノテーションを使用すると、Web サービスの開発が単純化されます。アノテーションは、一般的にデプロイメント記述子ファイル、WSDL ファイル、または XML ファイルおよび WSDL ファイルからソース成果物へのメタデータのマッピングで指定される情報を定義するために使用します。
例えば、単純な @WebService タグを Java ソースに埋め込み、Bean を Web サービスとして公開することができます。
@WebService アノテーションは、サーバー・ランタイム環境に対して、その Bean のすべてのパブリック・メソッドを Web サービスとして公開するように指示します。 さらに追加する細分度レベルは、個々のメソッドまたはパラメーターで追加のアノテーションを加えることにより、制御できます。 アノテーションの使用によって、Java 成果物を Web サービスとして公開することがたいへん簡単になります。さらに、成果物は、WSDL ファイルから始まるトップダウン・マッピング・ツールの一部を使用して作成されるため、 アノテーションは、ソース・ファイルとともにメタデータを取り込む手段として、ソースおよび Java クラス内に含まれます。@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
また、アノテーションを使用することにより、チーム構造内での Web サービスの開発が向上します。 これは、JAX-RPC Web サービスで必要に応じて、単一のデプロイメント記述子または共通デプロイメント記述子で各 Web サービスを定義する必要がないからです。 JAX-WS Web サービスでアノテーションを利用することにより、サービスと必要なメタデータの並列開発が可能になります。
JAX-WS Web サービスの場合、webservices.xml デプロイメント記述子はオプションで使用できます。これは、アノテーションを使用して、デプロイメント記述子ファイル内に含まれるすべての情報を指定することができるためです。デプロイメント記述子ファイルを使用して、 既存の JAX-WS アノテーションの拡張またはオーバーライドを行うことができます。webservices.xml デプロイメント記述子で定義した すべての情報により、アノテーションによって指定された対応するすべての情報がオーバーライドされます。
例えば、JAX-WS Web サービス用のサービス実装クラスに以下が含まれている場合を考えます。- @WebService アノテーション:
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- webservices.xml ファイルは、以下のように、WSDL 文書に異なるファイル名を指定します。
<webservices> <webservice-description> <webservice-description-name>ExampleService</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- @WebService アノテーション:
- 非同期での Web サービスの呼び出し
JAX-WS では、Web サービスは同期でも非同期でも呼び出されます。 JAX-WS は、非同期に Web サービスを呼び出す場合に、ポーリング・メカニズムとコールバック・メカニズムの両方のサポートを追加します。 ポーリング・モデルを使用する場合、クライアントは要求を発行し、戻ってくる応答オブジェクトを受け取りますが、 このオブジェクトはサーバーが応答したかどうかを判別するためにポーリングされます。 サーバーが応答した場合、実際の応答が取得されます。コールバック・モデルを使用する場合、クライアントはコールバック・ハンドラーを提供してインバウンド応答オブジェクトを受け入れ、処理します。 ポーリング・モデルとコールバック・モデルのどちらも、応答が戻るのを待たずにクライアントが処理を継続することを可能にし、Web サービスを呼び出すためのより動的で効率のよいモデルを提供できます。
例えば、Web サービス・インターフェースには同期要求と非同期要求の両方のためのメソッドがあることがあります。 非同期要求は、以下の例では太字で示されています。@WebService public interface CreditRatingService { // sync operation Score getCreditScore(Customer customer); // async operation with polling Response<Score> getCreditScoreAsync(Customer customer); // async operation with callback Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
コールバック・メカニズムを使用する非同期呼び出しでは、クライアント側プログラマーによる追加の入力が必要です。 このコールバックは、非同期応答が受信されるときに実行されるアプリケーション・コードを含むオブジェクトです。 以下のコード例を使用して、非同期コールバック・ハンドラーを呼び出します。CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // do work here... } } );
以下のコード例を使用して、非同期ポーリング・クライアントを呼び出します。CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Complete an action while we wait. } // No cast needed, because of generics. Score score = response.get();
- リソース注入の使用法
JAX-WS は、Web サービスの開発をさらに簡素化するために、リソース注入をサポートしています。JAX-WS は Java EE 5 のこの重要機能を使用して、Java ランタイム環境で共通リソースを作成し初期化するという負担を、Web サービス・アプリケーションからアプリケーション・コンテナー環境自体に移しています。JAX-WS は、ランタイム環境でのリソース注入とアプリケーション・ライフサイクル用に、JSR-250 で定義されているアノテーションのサブセットをサポートしています。
また、アプリケーション・サーバーは、JAX-WS で管理されるクライアントを宣言し、JAX-WS サービスおよびポートの注入を要求するために、@Resource または @WebServiceRef アノテーションの使用をサポートしています。これらのアノテーションのいずれかがフィールドまたはメソッドで使用されると、JAX-WS サービスまたはポート・インスタンスが注入されます。これらのアノテーションを使用した場合でも、アノテーションで指定されたタイプが JNDI 名前空間にバインドされます。
@Resource アノテーションは、Java Platform, Enterprise Edition 5 (Java EE 5) に含まれている JSR-250, Common Annotations 仕様で定義されています。@Resource アノテーションを、サービス・エンドポイント実装クラス内の javax.xml.ws.WebServiceContext タイプの変数に付加することにより、リソース注入を要求し、その特定のエンドポイント呼び出しに関連する javax.xml.ws.WebServiceContext インターフェースを収集することができます。WebServiceContext インターフェースから、getMessageContext() メソッドを使用して、特定のメソッド呼び出しと関連した要求の MessageContext を収集できます。
@WebServiceRef アノテーションは、JAX-WS 仕様で定義されています。
以下の例は、リソース注入のための @Resource アノテーションおよび @WebServiceRef アノテーションを示しています。@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
リソース注入について詳しくは、JAX-WS 仕様のセクション 5.2.1 および 5.3 を参照してください。
- JAXB 2.2 を使用したデータ・バインディング
JAX-WS では、Java Architecture for XML Binding (JAXB) 2.2 の API とツールを、Java オブジェクトと XML 文書をマップするためのバインディング・テクノロジーとして活用します。JAX-WS ツールは、Java オブジェクトと XML 文書間の双方向マッピング用のデフォルトのデータ・バインディングを JAXB ツールに依存しています。JAXB データ・バインディングは、JAX-RPC 仕様により記述されるデータ・バインディングに代わるものです。
JAX-WS 2.2 では、データ・バインディングに JAXB 2.2 が必要です。JAXB 2.2 は、スキーマ生成の改善および JAX-WS との統合強化のため、アノテーションのマイナーな機能拡張を行いました。
- 動的クライアントと静的クライアント
JAX-WS 用の動的クライアントはディスパッチ・クライアント (javax.xml.ws.Dispatch) と呼ばれます。ディスパッチ・クライアントは、XML メッセージング志向のクライアントです。 データは PAYLOAD モードか MESSAGE モードで送信されます。 PAYLOAD モードを使用する場合、ディスパッチ・クライアントは <soap:Body> の内容の提供のみを行い、JAX-WS は <soap:Envelope> および <soap:Header> エレメントを追加します。 MESSAGE モードを使用する場合、ディスパッチ・クライアントは <soap:Envelope>、<soap:Header>、および <soap:Body> エレメントを含む、全 SOAP エンベロープの提供を担当します。 JAX-WS は、メッセージには何も追加しません。ディスパッチ・クライアントは、コールバック・メカニズムまたはポーリング・メカニズムを使用する、非同期呼び出しをサポートします。
静的クライアントの JAX-WS 用のプログラミング・モデルは、プロキシー・クライアントと呼ばれます。 プロキシー・クライアントは、サービス・エンドポイント・インターフェース (SEI) (指定する必要があります) に基づいて Web サービスを呼び出します。
- MTOM のサポート
JAX-WS を使用することにより、イメージやファイルのようなバイナリー添付ファイルを Web サービス要求とともに送信できます。 JAX-WS は、Message Transmission Optimization Mechanism (MTOM) で規定されているバイナリー・データの最適化伝送のサポートを追加します。
- 複数のデータ・バインディング・テクノロジー
JAX-WS は、次のバインディング・テクノロジーをエンド・ユーザーに公開しています: XML Source、SOAP Attachments API for Java (SAAJ) 1.3、Java Architecture for XML Binding (JAXB) 2.2。XML Source により、ユーザーは、Source オブジェクト内の処理対象データを表す javax.xml.transform.Source をランタイム環境に渡すことができます。 SAAJ 1.3 には、ペイロードそのものだけではなく、全インターフェース内のすべての SOAP 文書を渡す機能が付きました。 このアクションは、インターフェースを越えて SAAJ SOAPMessage オブジェクトを渡すクライアントによって実行されます。JAX-WS では Java と XML 間のデータ・バインディング・テクノロジーの選択肢として JAXB 2.2 サポートを利用しています。
- SOAP 1.2 のサポート
SOAP 1.2 のサポートが JAX-WS 2.0 に追加されました。JAX-WS では、イメージやファイルのようなバイナリー添付ファイルを Web サービス要求とともに送信できるように、SOAP 1.1 と SOAP 1.2 の両方をサポートしています。 JAX-WS は、MTOM で規定されているバイナリー・データの最適化伝送のサポートを追加します。
- 開発ツール
JAX-WS は、JAX-WS Web サービスの移植可能成果物を生成するために wsgen および wsimport コマンド行ツールを提供しています。 JAX-WS Web サービスを作成する場合、WSDL ファイルまたは実装 Bean クラスのいずれかから開始することができます。 実装 Bean クラスから開始する場合は、wsgen コマンド行ツールを使用して、WSDL ファイル (要求があった場合) を含むすべての Web サービス・サーバー成果物を生成します。 WSDL ファイルから開始する場合は、wsimport コマンド行ツールを使用して、サーバーまたはクライアント用のすべての Web サービス成果物を生成します。 wsimport コマンド行ツールは、スキーマ定義を含む WSDL ファイルを処理し、移植可能な成果物を生成します。成果物には、サービス・クラス、サービス・エンドポイント・インターフェース・クラス、および対応する XML スキーマの JAXB 2.2 クラスが含まれます。
- Web Services for Java EE バージョン 1.3 のサポート
Web Services for Java EE version 1.3 仕様では、JAX-WS サービスおよびクライアントでアノテーションとデプロイメント記述子の両方のエントリーを使用して MTOM、Addressing、および RespectBinding フィーチャーを構成するためのサポートが追加されています。
- WRAPPED パラメーター・スタイルおよび戻りの型に対する空の targetNamespace のサポートJAX-WS 2.2 は、メソッド・パラメーターと戻りの型をサポートします。 JAX-WS Web サービス操作では、操作パラメーターとオプションの戻りの型を指定して Web サービス操作を定義できます。 @WebParam または @WebResult アノテーションを 付けた targetNamespace プロパティーに "" 値を指定することにより、 操作パラメーターと戻りの型が空の targetNamespace プロパティーを 定義した場合、JAX-WS ランタイム環境は以下のように動作します。
- 操作が文書スタイルで、パラメーター・スタイルが WRAPPED であり、パラメーターがヘッダーにマップされない場合、操作パラメーターと戻りの型には空の名前空間がマップされます。
- パラメーター・スタイルが WRAPPED でない場合、@WebParam または @WebResult アノテーションを 使用して指定した targetNamespace パラメーターの値が使用されます。