アノテーションを使用した JAX-WS Web サービスの開発
Java™ API for XML-Based Web Services (JAX-WS) は、XML メッセージ・レベルでサービスを使用できるようにするために、2 つの異なるサービス・エンドポイント、標準 Web サービス・エンドポイント・インターフェース、および新しい Provider インターフェースをサポートしています。サービス・エンドポイント実装またはクライアントでアノテーションを使用することによって、サービス・エンドポイントを Web サービスとして定義できます。
始める前に
このタスクについて
このタスクは、JAX-WS Web サービスを開発するために必要なステップです。
JAX-WS テクノロジーは、標準サービス・エンドポイント・インターフェースと新規プロバイダー・インターフェースの両方に基づいた Web サービスの実装をサポートします。JAX-WS エンドポイントは、 Java API for XML-based RPC (JAX-RPC) 仕様のエンドポイント実装に類似しています。 JAX-RPC とは異なり、サービス・エンドポイント・インターフェース (SEI) の要件は、JAX-WS Web サービスではオプションです。関連付けられた SEI を持たない JAX-WS サービスは、 暗黙的な SEI を持っていると見なされます。 それに対して、関連付けられた SEI を持つサービスは、明示的な SEI を持っていると見なされます。 JAX-WS が必要とするサービス・エンドポイント・インターフェースは、 JAX-RPC が必要とするサービス・エンドポイント・インターフェースよりも汎用で使用されます。 JAX-RPC 仕様では、java.rmi.Remote インターフェースを拡張するために SEI が 必要ですが、JAX-WS の場合、SEI は必要ありません。
また、JAX-WS プログラミング・モデルは、サービス・エンドポイント実装を Web サービスとして定義したり、Web サービスへのクライアントのアクセス方法を定義したりするために、メタデータを使用した Java クラスのアノテーション付けのサポートも使用します。JAX-WS は、Java プログラミング言語 (JSR 175) 仕様のメタデータ機能、 Java Platform (JSR 181) 仕様の Web サービス・メタデータ、 および JAX-WS 2.0 (JSR 224) 仕様によって定義されたアノテーション (Java Architecture for XML Binding (JAXB) アノテーションを含みます) に基づいてアノテーションをサポートします。アノテーションを使用することにより、サービス・エンドポイント実装は、WSDL ファイルを必要とすることなく単独で Web サービスを記述することができます。アノテーションは、サービス・エンドポイント実装または Web サービス・クライアントの構成に必要なすべての WSDL 情報を提供することができます。アノテーションは、クライアントおよびサーバーが使用するサービス・エンドポイント・インターフェースで指定することも、サーバー側のサービス実装クラスで指定することもできます。
サポートされる標準および仕様に関する詳細は、Web サービス仕様書および API 文書を参照してください。
既存の Java クラスから始めて JAX-WS Web サービスを開発する場合は (ボトムアップ・アプローチと呼ばれます)、最初にクラスを Web サービスとして定義するために、クラスに @WebService (javax.jws.WebService) アノテーションまたは @WebServiceProvider (javax.xml.ws.Provider) アノテーションを付ける必要があります。@WebService アノテーションがサービスをプロバイダー・ベースのエンドポイントとして定義するのに対して、 @WebService アノテーションは、サービスを SEI ベースのエンドポイントとして定義します。
- SEI ベースの JAX-WS Web サービスの開発
SEI ベースのエンドポイント、サービス・エンドポイント・インターフェース (SEI) は、それぞれ Java クラス、Java インターフェースであり、特定の Web サービスによって提供されるビジネス・メソッドを宣言します。Web サービス・クライアントが JAX-WS エンドポイントで呼び出せるメソッドは、明示的または暗黙的な SEI で定義されているビジネス・メソッドのみです。
すべての SEI ベースのエンドポイントは、実装クラスに @WebService アノテーションが含まれている必要があります。 サービス実装が明示的な SEI を使用する場合、そのインターフェースは、 @WebService アノテーションで endpointInterface 属性によって参照する必要があります。 サービス実装が明示的な SEI を使用しない場合、 サービスは実装クラスにより暗黙的に記述され、暗黙的な SEI になります。
- プロバイダー・インターフェースを使用した JAX-WS Web サービスの開発
JAX-WS プログラミング・モデルは、SEI ベースのエンドポイントの動的な代替として javax.xml.ws.Provider というプロバイダー・エンドポイント用のプロバイダー・インターフェースを 導入しています。プロバイダー・インターフェースは、Web サービスに対する、よりメッセージング指向の強いアプローチをサポートします。プロバイダー・インターフェースを使用して、 汎用サービス実装クラスを生成するための 単純なインターフェースを実装する Java クラスを作成できます。プロバイダー・インターフェースは、invoke メソッドという 1 つのメソッドを定義します。 このメソッドは、さまざまなメッセージまたはメッセージ・ペイロードを処理する際に総称を使用して入力タイプと出力タイプの両方を制御します。すべてのプロバイダー・エンドポイントには、@WebServiceProvider (javax.xml.ws.WebServiceProvider) アノテーションを使用してアノテーションを付ける必要があります。 サービス実装は、javax.xml.ws.Provider インターフェースを実装している場合には @WebService アノテーションを指定できません。
WebSphere® Application Server バージョン 7.0 以降からは、Java EE 5 アプリケーション・モジュール (Web アプリケーション・モジュールのバージョン 2.5 以上、または EJB モジュールのバージョン 3.0 以上) は、JAX-WS のサービスとクライアントの識別のためにアノテーションのスキャンが実行されます。ただし、Java EE 5 より前のアプリケーション・モジュール (Web アプリケーション・モジュールの バージョン 2.4 以前、または EJB モジュールのバージョン 2.1 以前) では、 パフォーマンス上の理由から、デフォルトでは JAX-WS アノテーションがスキャンされません。 バージョン 6.1 Feature Pack for Web Services では、デフォルトの動作として、アプリケーションのインストール時に、JAX-WS サービスを識別するために Java EE 5 より前の Web アプリケーション・モジュールをスキャンし、サービス・クライアントを探索するために Java EE 5 より前の Web アプリケーション・モジュールおよび EJB モジュールをスキャンしていました。 WebSphere Application Server バージョン 7.0 以降のデフォルトの動作では、以前のリリースのフィーチャー・パックとの後方互換性を維持するために、アプリケーションのインストール時またはサーバーの始動時に Java EE 5 より前のモジュールでアノテーションをスキャンしないようになっているため、Web アプリケーション・アーカイブ (WAR) ファイルまたは EJB モジュールの META-INF/MANIFEST.MF で UseWSFEP61ScanPolicy プロパティーを構成するか、または Java 仮想マシンのカスタム・プロパティー com.ibm.websphere.webservices.UseWSFEP61ScanPolicy をサーバーで定義して、アプリケーションのインストール時およびサーバーの始動時にスキャンを要求するようにする必要があります。アノテーションのスキャンについて詳しくは、JAX-WS アノテーションに関する情報を 参照してください。
手順
タスクの結果
Web サービス・アプリケーションを表すサービス・エンドポイント実装を定義しました。サポートされている JAX-WS アノテーションの詳細については、 JAX-WS の文書を参照してください。
JavaBeans サービス・エンドポイント実装およびインターフェースのサンプル
/** This is an excerpt from the service implementation file, EchoServicePortTypeImpl.java.
package com.ibm.was.wssample.echo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
@javax.jws.WebService(serviceName = "EchoService", endpointInterface =
"com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/",
portName="EchoServicePort")
public class EchoServicePortTypeImpl implements EchoServicePortType {
public EchoServicePortTypeImpl() {
}
public String echo(String obj) {
String str;
....
str = obj;
....
return str;
}
}
/** This is a sample EchoServicePortType.java service interface. */
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.*;
@WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/",
wsdlLocation="WEB-INF/wsdl/Echo.wsdl")
public interface EchoServicePortType {
/** ...the method process ...*/
@WebMethod
}
package jaxws.provider.source;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.transform.Source;
@WebServiceProvider()
public class SourceProvider implements Provider<Source> {
public Source echo(Source data) {
return data;
}
}
プロバイダー実装の例では、javax.xml.transform.Source タイプは、 汎用の <Source> メソッドで指定します。 汎用の <Source> メソッドは、入力タイプと出力タイプの両方が Source オブジェクトであることを指定します。
次のタスク
JavaBeans からの JAX-WS アプリケーション用 Java 成果物の作成。詳しくは、JAX-WS アプリケーション用 Java 成果物の生成に関する情報を参照してください。