Java API for XML-Based Web Services

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 プログラミング規格を実装することにより、Web サービスおよびクライアントの開発のための以下の拡張機能が実現します。
Java アプリケーションのプラットフォーム独立性の改善
JAX-WS API を使用することで、Web サービスおよびクライアントの開発が容易になるだけでなく、Java アプリケーションのプラットフォーム独立性を大幅に改善することができます。JAX-WS では動的プロキシーを利用しますが、JAX-RPC では生成されたスタブを使用します。動的プロキシー・クライアントは、生成または提供されるサービス・エンドポイント・インターフェース (SEI) に基づき、Web サービスを呼び出します。動的プロキシー・クライアントは、JAX-RPC プログラミング・モデルのスタブ・クライアントに似ています。JAX-WS の動的プロキシー・クライアントと JAX-RPC のスタブ・クライアントは、両方とも WSDL ファイルから生成されるサービス・エンドポイント・インターフェース (SEI) に基づくものですが、大きな違いがあります。動的プロキシー・クライアントは、実行時に Java 5 の動的プロキシー機能を使用して動的に生成されます。一方、JAX-RPC ベースのスタブ・クライアントはツールによって生成される移植不能な Java ファイルです。JAX-RPC のスタブ・クライアントとは異なり、動的プロキシー・クライアントでは、生成されるインターフェースは特定のベンダー情報を必要としないため、別のベンダーのためにアプリケーション・サーバー上でクライアントを実行する前にスタブを再生成しなくても済みます。動的プロキシー・クライアントの使用方法について詳しくは、JAX-WS 2.0 仕様の第 4 章を参照してください。
注釈

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 クラス内に含められます。

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()) {
		// 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 を収集できます。

以下に、リソース注入のために @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 は、JAXB の API とツールを Java オブジェクトと XML 文書とのマッピングのためのバインディング・テクノロジーとして利用しています。JAX-WS ツールは、JAXB ツールに依存して、Java オブジェクトと XML 文書との双方向マッピングのためのデフォルト・データ・バインディングを実行します。JAXB データ・バインディングでは、JAX-RPC 仕様に基づいて記述されているデータ・バインディングが置き換えられます。

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 の動的クライアント・プログラミング API をディスパッチ・クライアント (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 が他の何かをメッセージに追加することはありません。ディスパッチ・クライアントはコールバック・メカニズムまたはポーリング・メカニズムを使用して、非同期呼び出しをサポートします。</soap:Body></soap:Header></soap:Envelope></soap:Header></soap:Envelope></soap:Body>

JAX-WS の静的クライアント・プログラミング・モデルをプロキシー・クライアントといいます。このプロキシー・クライアントは、生成または提供されるサービス・エンドポイント・インターフェース (SEI) に基づき、Web サービスを呼び出します。

MTOM のサポート
JAX-WS を使用することにより、イメージやファイルのようなバイナリー添付ファイルを Web サービス要求とともに送信できます。JAX-WS を使用すると、Message Transmission Optimization Mechanism (MTOM) によって指定されるような最適化されたバイナリー・データ伝送のサポートが可能になります。
多重ペイロード構造
JAX-WS は、XML ソース、SOAP Attachments API for Java (SAAJ) 1.3、および Java Architecture for XML Binding (JAXB) 2.0 といったバインディング・テクノロジーをユーザーに公開します。XML ソースを使用すると、ランタイムに渡されるソース・オブジェクト内のデータを表す javax.xml.transform.Source をランタイムに渡すことができます。SAAJ 1.3 では、インターフェースを通じて、ペイロード自体のみでなく、SOAP 文書全体を渡すことができるようになりました。これは、クライアントがインターフェースを通じて SAAJ SOAPMessage オブジェクトを渡すことによって実現します。JAX-WS では、 Java と XML の間のデータ・バインディングのための最適なテクノロジーとして JAXB 2.0 のサポート機能を利用しています。
SOAP 1.2 のサポート
SOAP 1.2 のサポートが JAX-WS 2.0 に追加されました。JAX-WS では SOAP 1.1 と SOAP 1.2 の両方がサポートされています。SOAP 1.2 は、SOAP 処理モデルについてより具体的な定義を示しています。そのため、Web Services-Interoperability (WS-I) プロファイルがない場合にインターオペラビリティーの問題を招く可能性がある、あいまいな表現の多くが解消されています。SOAP 1.2 を採用することで、異なるベンダー間での SOAP 1.2 の実装に伴うインターオペラビリティーの問題が発生する可能性が少なくなります。以前のバージョンとのインターオペラビリティーはありません。
メソッド・パラメーターおよび戻りの型のサポート
JAX-WS 2.2 はメソッド・パラメーターおよび戻りの型をサポートしています。JAX-WS Web サービス操作で、Web サービス操作に操作パラメーターおよび戻りの型 (オプション) を定義できます。 @WebParam または @WebResult 注釈のいずれかで targetNamespace プロパティーに "" 値を指定することにより、操作パラメーターおよび戻りの型で空の targetNamespace プロパティーを定義すると、JAX-WS ランタイム環境は次のように振る舞います。
  • 操作が文書スタイルであり、パラメーター・スタイルが WRAPPED である場合、パラメーターはヘッダーにマップされません。空の名前空間が、操作パラメーターおよび戻りの型にマップされます。
  • パラメーター・スタイルが WRAPPED でない場合、@WebParam または @WebResult 注釈を使用して指定された targetNamespace パラメーターの値が使用されます。

JAX-WS 2.1.6

Java クラスから JAX-WS Web サービスが作成されると、そのクラスの public メソッドがオペレーションとして公開され、Web サービスの WSDL 規約の一部となります。これらのメソッドとオペレーションの間のマッピングは主に JSR-181 および JSR-250 により管理されます。これらの規則により、Java クラスの public メソッドおよびその下の階層 (java.lang.Object は除く) が、以下の条件が満たされた場合に公開されます。
  • メソッドに @WebMethod または @WebMethod(exclude=false) 注釈、含まれるクラスに @WebService 注釈が付けられている
  • メソッドには @WebMethod 注釈が付けられていないが、含まれるクラスには @WebService 注釈が付けられており、他に @WebMethod または @WebMethod(exclude=false) 注釈が付けられているメソッドがない
JAX-WS 2.1.6 は、Web サービス・インターフェース上で Java クラスのメソッドが公開される方法の規則を変更します。ここで、Java クラスの public メソッドおよびその下の階層 (java.lang.Object は除く) が、以下の条件が満たされた場合に公開されます。
  • メソッドに @WebMethod または @WebMethod(exclude=false) 注釈が付けられている
  • メソッドに @WebMethod 注釈が付けられていないが、含まれるクラスには @WebService 注釈が付けられている
例:
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 の使用に関するガイダンスを使用できるようにするには、「ウィンドウ」 > 「設定」 > 「一般」 > 「サービス・ポリシー」 > 「WebSphere プログラミング・モデル」 > 「JAX-WS」にアクセスし、JAX-WS 2.1.6 メソッド公開ガイダンスの設定を true に設定してください。

JAX-WS 2.2

JAX-WS バージョン 2.2 および Web Services for Java EE (JSR 109) バージョン 1.3 仕様をサポートするサーバー・ランタイム環境は以下のとおりです。
  • WebSphere Application Server Liberty Profile V8.5.5
  • WebSphere Application Server V8.5
  • WebSphere Application Server V8.0

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) を参照してください。

トピックのタイプを示すアイコン 概念のトピック
インフォメーション・センターのご利用条件 | フィードバック

タイム・スタンプ・アイコン 最終更新: May 29, 2014 10:20

ファイル名: cjaxws.html