Java API for XML-Based Web Services (JAX-WS) は、 XML メッセージ・レベルでサービスを使用できるようにするために、標準 JavaBeans サービス・エンドポイント・インターフェースと新規プロバイダー・インターフェースの 2 つの異なるサービス・エンドポイント実装タイプをサポートします。 サービス・エンドポイントまたはクライアントでアノテーションを使用することによって、 サービス・エンドポイントを Web サービスとして定義できます。
このタスクは、 JavaBeans コンポーネントから JAX-WS Web サービスを開発するために必要なステップです。
JAX-WS テクノロジーにより、 標準 JavaBeans サービス・エンドポイント・インターフェースと新規プロバイダー・インターフェースの両方をベースにした Web サービスの実装が使用可能になります。 JAX-WS の JavaBeans エンドポイントは、 Java API for XML-based RPC (JAX-RPC) 仕様のエンドポイント実装に類似しています。 JAX-RPC とは異なり、サービス・エンドポイント・インターフェース (SEI) の要件は、 JavaBeans ベースのサービスではオプションです。 関連付けられた 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 情報のすべてを提供できます。 アノテーションは、クライアントおよびサーバーが使用するサービス・エンドポイント・インターフェースで指定することも、サーバー側のサービス実装クラスで指定することもできます。
JAX-WS Web サービスを開発するには、 JavaBeans エンドポイント用の javax.jws.WebService アノテーション、 またはプロバイダー・エンドポイント用の javax.jws.WebServiceProvider アノテーションを 使用して Java クラスにアノテーションを付ける必要があります。 これらのアノテーションは、Java クラスを Web サービス・エンドポイントとして定義します。 JavaBeans エンドポイントの場合、サービス・エンドポイント・インターフェース またはサービス・エンドポイント実装は、それぞれ、特定の Web サービスによって提供されるビジネス・メソッドを宣言する Java インターフェースまたは Java クラスです。 Web サービス・クライアントが起動できる、JavaBeans エンドポイントのメソッドは、 明示的または暗黙的サービス・エンドポイント・インターフェースに定義されているビジネス・メソッドのみです。
すべての JavaBeans エンドポイントは、Bean クラスに @WebService (javax.jws.WebService) アノテーションが含まれている必要があります。 サービス実装 Bean が SEI も使用する場合、そのエンドポイント・インターフェースは、 そのアノテーションの endpointInterface 属性によって参照する必要があります。 サービス実装 Bean が SEI を使用しない場合、 サービスは Bean に定義されている暗黙的 SEI によって記述されます。
JAX-WS プログラミング・モデルは、サービス・エンドポイント・インターフェースの代替として javax.xml.ws.Provider という新規プロバイダー API を 導入しています。 プロバイダー・インターフェースは、Web サービスに対する、よりメッセージング指向の強いアプローチをサポートします。 プロバイダー・インターフェースを使用して、汎用サービス実装クラスを生成するための、 単純なインターフェースを実装する Java クラスを作成できます。 プロバイダー・インターフェースには invoke メソッドという 1 つのメソッドがあります。 これは、さまざまなメッセージまたはメッセージ・ペイロードを処理するときに総称を使用して入力タイプと出力タイプの両方をコントロールしています。 すべてのプロバイダー・エンドポイントには、@WebServiceProvider (javax.xml.ws.WebServiceProvider) アノテーションを使用してアノテーションを付ける必要があります。 サービス実装は、javax.xml.ws.Provider インターフェースを実装している場合には @WebService アノテーションを指定できません。
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 invoke(String obj) { String str; .... str = obj; .... return str; } }
/** This is a sample EchoServicePortType.java service interface */ import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; 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 @WebResult(name = "response", targetNamespace = "http://com/ibm/was/wssample/echo/") @RequestWrapper(localName = "invoke", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.Invoke") @ResponseWrapper(localName = "echoStringResponse", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.EchoStringResponse") public String invoke( @WebParam(name = "arg0", targetNamespace = "http://com/ibm/was/wssample/echo/") String arg0); }
プロバイダー・エンドポイント実装のサンプル
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 invoke(Source data) { return data; } }
この例では、プロバイダー実装の javax.xml.transform.Source タイプは、 汎用の <Source> メソッドで指定します。 汎用の <Source> メソッドは、入力タイプと出力タイプの両方が Source オブジェクトであることを指定します。 プロバイダー・インターフェースを実装するエンドポイント・インターフェースには、 @WebServiceProvider アノテーションを含める必要があります。