Java™ API for XML-Based Web Services (JAX-WS) は、JSR-224 とも呼ばれ、Java API for XML-based RPC (JAX-RPC) プログラミング・モデルによって提供される基盤を拡張する次世代 Web サービス・プログラミング・モデルです。JAX-WS を使用することで、Web サービスおよびクライアントの開発が容易になるのみでなく、動的プロキシーおよび Java 注釈を利用して、Java アプリケーションのプラットフォーム独立性を大幅に改善することができます。この製品に含まれている Web サービス・ツールでは、JAX-WS 2.0、2.1、および 2.2 がサポートされています。
JAX-WS は、標準的なアノテーション・ベースのモデルをサポートして Web サービス・アプリケーションおよびクライアントを開発することにより、アプリケーションの開発を簡素化する、新しいプログラミング・モデルです。JAX-WS プログラミング規格は、文書中心のメッセージング・モデルを推進する最近の業界の傾向に戦略的に沿うものであり、JAX-RPC で定義されるようなリモート・プロシージャー・コール・プログラミング・モデルを置き換えます。この製品は、引き続き JAX-RPC プログラミング・モデルおよびアプリケーションをサポートしていますが、JAX-RPC には制約があり、最新の文書中心のサービスの多くがサポートされません。JAX-WS は、Web サービス開発のための戦略的プログラミング・モデルであり、JavaEE 5 プラットフォームの必須部分です。
JAX-WS では、メタデータを使用して Java クラスに注釈を付加し、その Java クラスが Web サービスであることを示すという処理がサポートされるようになりました。JAX-WS では、Metadata Facility for the Java Programming Language (JSR 175) 仕様および Web Services Metadata for the Java Platform (JSR 181) 仕様に基づく注釈、および JAX-WS 2.0 仕様で規定されている注釈の使用をサポートしています。Java ソース内および Java クラス内で注釈を使用すると、通常はデプロイメント記述子ファイルや WSDL ファイルから取得する追加情報の一部を定義するか、メタデータを XML ファイルや WSDL ファイルからソース成果物へマッピングすることにより、Web サービスの開発を簡略化することができます。
例えば、単純な @WebService タグを Java ソースに埋め込み、Bean を Web サービスとして公開することができます。
@WebService
public class QuoteBean implements StockQuote {
public float getQuote(String sym) { ... }
}
@WebService 注釈によって、この Bean にあるすべての public メソッドを Web サービスとして公開するように、サーバー・ランタイム環境に指示されます。個々のメソッドまたはパラメーターに関するその他の注釈を追加して、さらにきめ細かなレベルで制御することもできます。アノテーションの使用によって、Java 成果物を Web サービスとして公開することがたいへん簡単になります。また、成果物は WSDL ファイルから起動されるいくつかのトップダウン・マッピング・ツールを使用して作成されるので、注釈は、ソース・ファイルと一緒にメタデータを取得するための手段として、ソース内および Java クラス内に含められます。
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()) {
// do something while we wait
}
// no cast needed, thanks to generics
Score score = response.get();
</Score>
JAX-WS では、Web サービス開発をさらに簡単に行えるようにリソースの注入をサポートしています。 JAX-WS は、この Java EE 5 の主要な機能を使用して、 Java ランタイム環境で共通リソースを作成および初期化する際の Web サービス・アプリケーションに対する負荷を、アプリケーション・コンテナー環境自体へシフトすることができます。JAX-WS では、リソース注入およびそのランタイム環境におけるアプリケーション・ライフサイクルのために、JSR-250 で定義されている注釈のサブセットをサポートしています。
アプリケーション・サーバーでは、JAX-WS 管理クライアントを宣言するため、および JAX-WS サービスとポートの挿入を要求するための、@Resource または @WebServiceRef 注釈の使用もサポートしています。これらの注釈のいずれかがフィールドまたはメソッドで使用されると、JAX-WS サービスまたはポートのインスタンスが注入されます。また、これらの注釈を使用すると、注釈で指定されたタイプが JNDI 名前空間にバインドされます。
@Resource 注釈は、JSR-250 (Java Platform, Enterprise Edition 5 (Java EE 5) に組み込まれている Common Annotations 仕様) で定義されます。サービス・エンドポイント実装クラス内で、タイプ javax.xml.ws.WebServiceContext の変数に @Resource 注釈を付けることにより、リソースの注入を要求し、その特定のエンドポイント呼び出しに関連した javax.xml.ws.WebServiceContext インターフェースを収集することができます。WebServiceContext インターフェースから、getMessageContext() メソッドを使用して、特定のメソッド呼び出しに関連した要求のための MessageContext を収集できます。
@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 を参照してください。
WebSphere® Application Server Version 7.0 は JAXB 2.1 仕様をサポートしています。 JAX-WS 2.1 は、データ・バインディングのために JAXB 2.1 を必要とします。JAXB 2.1 は、改良されたコンパイル・サポートや @XMLSeeAlso 注釈のサポートなどの拡張、および完全なスキーマ 1.0 サポートを提供しています。
WebSphere Application Server バージョン 8.0 以上および、WebSphere Application Server Liberty Profile V8.5.5 は、JAXB 2.2 仕様をサポートします。JAX-WS 2.2 は、データ・バインディングのために JAXB 2.2 を必要とします。JAXB 2.2 では、スキーマ生成や JAX-WS との統合を改善するため、注釈に若干の機能拡張が行われています。
JAX-WS の静的クライアント・プログラミング・モデルをプロキシー・クライアントといいます。このプロキシー・クライアントは、生成または提供されるサービス・エンドポイント・インターフェース (SEI) に基づき、Web サービスを呼び出します。
public class Base
{
@WebMethod(exclude=false)
public void superExposed(String s) {}
public String supernoanno(String s) {}
}
@WebService
public class BeanImpl extends Base
{
@WebMethod(exclude=false)
public void exposed(String s) {}
public String nonpublic(String s) {}
}
JAX-WS 2.1.6 より前のバージョンでは、公開されるメソッドは public
void exposed(String s) のみでした。JAX-WS 2.1.6 以降では、以下のメソッドが公開されます。public void exposed(String s)
public String nonpublic(String s)
public void superExposed(String s)
WebSphere Application Server バージョン 7.0.0.7 以降 には、IBM® JDK 6 SR6 を通してこれらの変更が組み込まれています。ワークベンチで JAX-WS 2.1.6 の使用に関するガイダンスを使用できるようにするには、true に設定してください。
にアクセスし、JAX-WS 2.1.6 メソッド公開ガイダンスの設定をJAX-WS 2.2 仕様は、JAX-WS 2.1 に置き換わるもので、2.1 仕様の機能が組み込まれています。JAX-WS 2.2 では、 WebServiceFeature に関連した注釈 (@MTOM、@Addressing、および @RespectBinding 注釈など) の使用に関するクライアント・サイドのサポートが追加されています。JAX-WS 2.1 で既に、サーバー上でのこれらの注釈のサポートが追加されていました。さらに、Web Services for Java EE 1.3 仕様では、 これらの WebServiceFeature 関連アノテーションのサポートが導入され、これらのフィーチャーをクライアントおよびサーバーの両方で構成するための デプロイメント記述子エレメントの使用もサポートされるようになりました。JAX-WS 2.2 では、データ・バインディングのために Java Architecture for XML Binding (JAXB) バージョン 2.2 が必要です。
JAX-WS について詳しくは、正式な JSR-224 仕様 (JSR 224: Java API for XML-Based Web Services (JAX-WS) 2.0) を参照してください。