Webサービスは、ネットワークを通じてシステムの機能をサービスとして公開する技術で、既存システムの有効活用やソフトウェアの再利用を促進する方法として注目を集めています。
これらを実現するために、Webサービスは、HTTPを下位プロトコルに利用するSOAPを使用して通信を行い、公開するサービスのインタフェースはWSDLで定義することが標準となっています。
また、Webサービスは相互接続性が重要であり、制約や、Webサービスで使用する仕様(SOAP/WSDL/UDDIなど)のあいまいな点の明確化などが、WS-I Basic Profileに規定されています。
実際にWebサービスを提供するには、以下の規約に基づいてサービスエンドポイントインタフェースを決定し、サービスエンドポイントを提供します。
SOAP
ネットワーク経由でオブジェクト間通信を行うプロトコルです。XMLを用いて記述するデータ構造が既定されていますが、データを転送するプロトコルは既定されておらず、HTTPやSMTPなど様々なプロトコルにのせることができます。ただし、一般的には、HTTPを利用することが多いようです。
JAX-WS
アプリケーションのリモート呼び出し(Remote Procedure Call)をJavaで実現するために規定されたJAX-RPCの後継です。Webサービスで公開する機能をJavaで記述する場合には、この規約の範囲内で作成します。
WS-I Basic Profile 1.1
相互接続性向上の観点からWebサービスの標準であるSOAP/WSDL/UDDIなどの仕様について詳細化・制約付加を規定した規約です。ワークベンチでWebサービスアプリケーションを作成する過程において、通常は規約の中身について意識する必要はありません。WSDLを直接作成して公開するような場合は、規約を意識する必要があります。
WS-I Attachments Profile 1.0
添付ファイルを利用したときにWebサービスの相互接続性向上のため、SOAP Messages with Attachmentsをベースにして、SOAPやWSDL定義の仕様の明確化や使用範囲の限定を定めた規約です。WebサービスをWS-I Attachments Profileに準拠させることにより、添付ファイル付きSOAPメッセージを送受信する際のシステム間での相互運用性が向上します。
ポイント
開発方法には、サービスエンドポイントインタフェースをWSDLで設計するトップダウン開発と、サービスエンドポイントとなるJavaクラスを作成し、その結果としてサービスエンドポイントインタフェースが決定するボトムアップ開発があります。
J2EE1.4のWebサービスとJava EEのWebサービスでは以下の点で仕様が異なります。
JAX-RPCとJAX-WS
J2EE1.4ではJAX-RPCに準拠していましたが、Java EEではJAX-WSに準拠したWebサービスの開発を推奨しています。
Webサービスを構成するファイル
J2EE1.4ではSEI(サービスエンドポイントインタフェース)、実装クラス、WSDL、マッピングファイル、deployment descriptorなどWebサービスを作成するために多数のファイルを必要としましたが、Java EEでは、Javaクラスに@WebServiceアノテーションを宣言するだけでWebサービスを作成することができます。
Webサービスの呼び出し方法
Java EEではWebサービスに限らず、Dependency Injectionを用いて従来のlookup処理を簡単に記述することができます。
以下に、Webサービス開発時に使用する主なアノテーションについて、簡単な例を示しながらJava EEでのWebサービスについて紹介します。
javax.jws.WebServiceアノテーション
クラスをWebサービスとして定義するアノテーションです。以下のプロパティを指定できます。
プロパティ名 | 解説 |
---|---|
endpointInterface | クラスのメソッドをすべて公開したくないような場合にサービスエンドポイントインタフェースを定義し、それを宣言するために使用します。 |
name | WSDLのportTypeの名前 |
portName | WSDLのportの名前 |
serviceName | WSDLのサービスの名前 |
targetNamespace | WSDLの名前空間 |
wsdlLocation | 定義済みのWSDLに基づいてWebサービスを公開する場合に使用します。 |
WebServiceアノテーションを使用したWebサービスの作成例
package sample; import javax.jws.WebService; @WebService(endpointInterface="sample.Calc") public class CalcImpl implements Calc { public int add(int param1,int param2) { return param1 + param2; } } |
javax.xml.ws.WebServiceRefアノテーション
Webサービスを呼び出す場合に、Dependency Injectionするためのアノテーションです。以下のプロパティを指定できます。
プロパティ名 | 解説 |
---|---|
mappedName | マッピングされるリソース名 |
name | JNDI名 |
type | リソースのJava型 |
value | サービスクラス 通常は、javax.xml.ws.Serviceを継承します。 |
wsdlLocation | WSDLの位置を指定します。 |
WebServiceRefアノテーションを使用したWebサービスクライアントの作成例
@WebServiceRef(name="service/Calc") private CalcService service; public int callCalc(int param1,int param2) { Calc port = service.getCalcPort(); return port.add(param1,param2); } |