FrontPage

JAX-WS

JAX-WSはJava API for XML-Based Web Servicesの略であり、Java言語でXMLベースのメッセージ交換を行うWebサービスを実装するためのAPI仕様です。JAX-WSはJCP内でJSR-224として標準化されました。
JAX-WSはJavaEE5の仕様として新たに登場したAPI仕様ですが、当初はJAX-RPC 1.1の次のリリースとして提供する予定だったため、JAX-RPC後継の位置づけでバージョン2.0から始まっています。
JAX-WS仕様はJAX-RPC仕様と比較して、次のように目的や互換性が大きく異なっています。

  • リクエスト/リプライの同期型メソッド呼び出しからメッセージ指向へと開発の流れが移ったこと
  • 下位(JAX-RPC 1.x)との互換性がないこと

JAX-RPCとJAX-WSの仕様の違いについては、次の通りです。

仕様JAX-RPC1.1JAX-WS2.0
SOAPSOAP1.1左記+SOAP2.0
バインディングSOAP/HTTPバインディング左記+XML/HTTPバインディング
データマッピングSOAPエンコーディングJAXB
サービス呼び出し方式同期/要求応答型および一方型左記+非同期型

JAX-WSによるWebサービスの仕組み

JAX-WSによるWebサービスの仕組みについて説明します。

構成要素

JAX-WSによるWebサービスは、次の構成要素によって実現しています。

リクエスタアプリケーション
Webサービスを利用するアプリケーション。SEIやプロキシを利用してWebサービスを呼び出すプログラムを開発者が作成します。
サービスエンドポイント実装クラス
Webサービスとして実際に公開するクラス。SEIで定義した仕様に従ってWebサービスプログラムを開発者が作成します。
サービスエンドポイントインタフェース(SEI)
サービスの呼び出し方を定義したインタフェース。
プロキシ
Webサービスを呼び出すために必要なクラス群。wsimportコマンドを用いてWSDLから自動生成します。
JAXB
JavaデータとXMLデータのデータマッピングを行うために利用します。
JAX-WSエンジン
JAX-WSを実装したWebサービスを実行するためのエンジン。
WSDL(Web Services Description Language)
WSDLは、Webサービスのインタフェース記述言語で、XMLによって記述されています。SOAPと同じくW3Cで仕様策定されています。
SOAP(Simple Object Access Protocol)
Webサービスのためのプロトコルで、W3Cによって仕様策定されています。SOAPは一種のプロトコルですが、「SOAPメッセージ」と呼ばれるXML形式のメッセージ構造の仕様のみを規定しています。
jax-ws.jpg

Web Services Metadata for the Java Platform

Java言語でWebサービスの定義や情報を表現するために規定されたアノテーション仕様です。
開発者はPOJOベースのクラスやインタフェースに規定されたアノテーションを付与することで、そのクラスやインタフェースがのWebサービスであることを表したり、Webサービスに関する様々な情報を定義することができます。
規定されているアノテーションは、次の通りです。

アノテーション記述可能な要素説明
@WebService?Webサービスであることを表します。
@WebMethod?メソッドWebサービスのオペレーションとして公開することを表します。
@Onewayメソッド一方向型のオペレーションであることを表します。付与するメソッドの戻り値はvoid型である必要があります。
@WebParam?メソッド引数オペレーションの引数とWSDLのmessage要素以下のpart要素とマッピングします。
@WebResult?メソッドオペレーションの戻り値とWSDLのmessage要素以下のpart要素とマッピングします。
@RequestWrapper?メソッドオペレーションの引数のラッパに関する設定を行います。
@ResponseWrapper?メソッドオペレーションの戻り値のラッパに関する設定を行います。
@HandlerChain?型、メソッド、フィールドハンドラチェーンに関する設定を行います。
@SOAPBinding型、メソッドSOAP/HTTPバインディングに関する設定を行います。

JAX-WSにおけるオペレーションスタイル/エンコーディングスタイル/パラメータスタイル

  • オペレーションスタイル
    SOAPでは、オペレーション(サービスメソッド)の呼び出し方を「オペレーションスタイル」と呼びます。JAX-WSにおけるオペレーションスタイルは、次の二種類が存在します。
ドキュメント指向
XMLをそのままの形で交換する目的にSOAPメッセージを使用する考えたです。しかし、SOAPのように交換するメッセージ構造が事前にわかっていれば、ドキュメント指向であってもRPC指向的な使用方法も可能です。
RPC指向
RPCのためにSOAPメッセージを使用する考え方です。要求メッセージがサービスメソッドの引数になり、応答メッセージがサービスメソッドの戻り値になります。
  • エンコーディングスタイル
    SOAPでは、プロバイダやリクエスタが取り扱うアプリケーションデータとXMLデータの相互変換方式のことを「エンコーディングスタイル」と呼びます。JAX-WSにおけるエンコーディングスタイルは、リテラルのみ存在します。
リテラル
SOAPエンコーディングは行いません。そのため、WSDLに記述されているXMLスキーマに従って、アプリケーションデータとXMLデータの相互変換を行います。
エンコーデッド
SOAPエンコーディングを行います。WS-Iの「Basic Profile」で非推奨となったため、JAX-WSでは非サポートです。
  • パラメータスタイル
    SOAPメッセージでは、オペレーションスタイルがドキュメント指向の場合に限り、「パラメータスタイル」という考え方があります。パラメータスタイルとは、SOAPメッセージ中で、サービスのオペレーション(サービスメソッド)名や引き数名を表現する方法のことです。JAX-WSにおけるパラメータスタイルは、次の二種類が存在します。
WRAPPED
SOAPメッセージ中にオペレーション(サービスメソッド)名を含むタグが登場します。またオペレーション(サービスメソッド)に複数の引数を指定することができます。
BARE
SOAPメッセージ中にオペレーション(サービスメソッド)名を含むタグが登場しません。またオペレーション(サービスメソッド)の引数は1つしか指定することができません。
  • まとめ
スタイルの組み合わせオペレーション(サービスメソッド)でサポートする引数の数補足
ドキュメント指向/リテラル/WAPPED単一、複数
ドキュメント指向/リテラル/BARE単一
RPC指向/リテラル単一、複数

開発方法

JAX-WSによるWebサービスの開発は、「ボトムアップ・アプローチ」と「トップダウン・アプローチ」の2つの方法があります。

ボトムアップ・アプローチ

  1. サービスクラスを作成する
  2. 作成したサービスクラスからラッパクラスとWSDLを生成する
  3. WSDLからプロキシ、SEIを生成する

トップダウン・アプローチ

  1. WSDLを作成する
  2. 作成したWSDLからプロキシ、SEIを生成する
  3. 定義されている仕様に従ってサービスクラスを作成する

開発例(ボトムアップ・アプローチ)

筆者の環境の都合上、次の環境を前提とします。

  • Java SE6
  • Glassfish Server open Source Edition 3.1 Final
  • Eclipse IDE(Helios)
  • Glassfish Eclipse plugin

サービスプロバイダの作成

  • Eclipseを起動して、「jaxws-provider」という名前でDynamic Web Projectを作成します。
  • Javaリソースの下に次のサービスクラスを作成します。
package jp.opensquare.sandbox.jaxws.provider.calculate;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

@WebService(
		serviceName="CalculateService",
		portName="CalculatePort",
		targetNamespace="calculate.provider.jaxws.sandbox.opensquare.jp")
@SOAPBinding(
		use=Use.LITERAL,
		style=Style.DOCUMENT,
		parameterStyle=ParameterStyle.WRAPPED)
public class Calculate {
	@WebMethod
    @RequestWrapper(
    		localName = "add",
    		targetNamespace = "calculate.provider.jaxws.sandbox.opensquare.jp",
    		className = "jp.opensquare.sandbox.jaxws.provider.calculate.Add")
    @ResponseWrapper(
    		localName = "addResponse",
    		targetNamespace = "calculate.provider.jaxws.sandbox.opensquare.jp",
    		className = "jp.opensquare.sandbox.jaxws.provider.calculate.AddResponse")
	public int add(int valueA, int valueB) {
		return valueA + valueB;
	}
}
  • 作成したサービスクラスからラッパクラスとWSDLを生成する
$ cd workspace/jaxws-provider
$ mkdir ./WebContent/WEB-INF/wsdl
$ wsgen -cp ./build/classes/ -d ./build/classes/ -r ./WebContent/WEB-INF/wsdl jp.opensquare.sandbox.jaxws.provider.calculate.Calculate -wsdl

wsgenコマンドが正しく実行できると、次のクラスファイルとWSDLが生成されます。

./build/classes/jp/opensquare/sandbox/jaxws/provider/calculate/Add.class
addオペレーションの引数ラッパ。
./build/classes/jp/opensquare/sandbox/jaxws/provider/calculate/AddResponse?.class
addオペレーションの戻り値ラッパ。
./WebContent?/WEB-INF/wsdl/CalculateService?.wsdl
CalculateサービズのWSDL。
./WebContent?/WEB-INF/wsdl/CalculateService_schema1.xsd
WSDLから参照されるオペレーションの引数、戻り値のスキーマ。
  • 「jaxws-provider」選択し、サーバ上で実行します。

サービスリクエスタの作成

  • Eclipseを起動して、「jaxws-requestor」という名前でJava Projectを作成します。
  • WSDLからプロキシ、SEIを生成します。
$ cd workspace/jaxws-requestor
$ wsimport -s ./src/ -d ./bin/ http://localhost:8080/jaxws-provider/CalculateService?wsdl

wsimportコマンドが正しく実行できると、次のソースコードとソースコードに対応するクラスファイルが生成されます。

jp.opensquare.sandbox.jaxws.provider.calculate.Add.java
Addオペレーションの引数ラッパ。
jp.opensquare.sandbox.jaxws.provider.calculate.AddResponse?.java
Addオペレーションの戻り値ラッパ。
jp.opensquare.sandbox.jaxws.provider.calculate.Calculate.java
CalculateサービスのSEI。
jp.opensquare.sandbox.jaxws.provider.calculate.CalculateService?.java
Calculateサービスのプロキシ。
jp.opensquare.sandbox.jaxws.provider.calculate.ObjectFactory?.java
JAXB仕様。XMLのエレメントとJavaのクラスをマッピングし、インスタンスを生成するためのファクトリ。
jp.opensquare.sandbox.jaxws.provider.calculate.package-info.java
JAXB仕様。XMLの名前空間とJavaのパッケージをマッピングする。
  • リクエスタアプリケーションを作成します。
package jp.opensquare.sandbox.jaxws.requestor.calculate;

import jp.opensquare.sandbox.jaxws.provider.calculate.Calculate;
import jp.opensquare.sandbox.jaxws.provider.calculate.CalculateService;

public class CalculateRequestor {
	public static void main(String[] args) {
		CalculateService service = new CalculateService();
		Calculate port = service.getCalculatePort();
		int result = port.add(1, 2);
		System.out.println(result);
	}
}

開発例(トップダウン・アプローチ)

環境は、ボトムアップ・アプローチと同様とします。またWSDLは事前に手元に存在していることとします。

サービスプロバイダの作成

  • Eclipseを起動して、「jaxws-provider2」という名前でDynamic Web Projectを作成します。
  • WSDLからプロキシ、SEIを生成します。
$ cd workspace/jaxws-porvider2
$ wsimport -s ./src/ -d ./build/classes/ CalculateService.wsdl
  • SEIに従いサービスクラスを実装します。
package jp.opensquare.sandbox.jaxws.provider.calculate;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(
		name = "CalculateImpl",
		serviceName="CalculateService",
		portName="CalculatePort",
		endpointInterface="jp.opensquare.sandbox.jaxws.provider.calculate.Calculate",
		targetNamespace = "calculate.provider.jaxws.sandbox.opensquare.jp")
public class CalculateImpl implements Calculate {
	@WebMethod
	@Override
	public int add(int a, int b) {
		return a + b;
	}
}
  • 「jaxws-provider2」選択し、サーバ上で実行します。

サービスリクエスタの作成

サービスリクエスタについては、ボトムアップ・アプローチと同様のため、省略します。


添付ファイル: filejax-ws.jpg 1530件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-04-19 (火) 02:02:16 (2770d)