matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

Spring Web Services まとめ その1

前から気になってたSpring Web Services(以下 Spring-WS)を試しているので少しづつまとめてみるテスト。

Spring-WSの特徴 (Chapter 1)

Spring-WSはドキュメントドリブンなWebサービス開発を行うためのプロダクト。
contract-firstな開発を行うもので、XML Schema(XSD)ファイルを元にサービスの実装を行っていく(WSDLファイルは自分で作成する or Spring-WSがXSDとSpring Frameworkコンフィギュレーションを元に公開してくれる)。JavaのオブジェクトからWSDLを生成してWebサービスとして公開する、といった類のものではない。
Spring-WSの内部ではSpring Frameworkを利用しているため、Webサービス実装に対するDIなども可能。
その他のキーワードは以下の通り。

  • 強力なマッピング機能
    • 取得したXML形式のリクエストを様々なオブジェクトに変換可能(メッセージのペイロードSOAPヘッダ、XPathの記述による)。
  • XML APIのサポート
    • 標準のJAXP API(DOM、SAX、StAX)以外にも、様々なAPIでハンドリング可能(JDOM、dom4j、XOMなど)。
  • 柔軟なXML Marshalling
    • オブジェクト/XML間のマッピングモジュールとして、JAXB 1、JAXB 2、Castor、XMLBeans、JiBX、XStreamをサポート。各モジュールは独立したモジュールとなっているため、Webサービスの実装以外でも利用可能。
  • Spring Frameworkの知識の再利用
  • WS-Securityのサポート
    • SOAPメッセージの暗号化/復号化や認証を行うことが可能。
  • Acegi Securityとの統合
  • Mavenによるビルド
  • Apacheライセンス

なんでcontract-firstなのか (Chapter 2)

上で書いたように、Spring-WSはcontract-firstな開発のみサポート。その理由は以下の通り。

Object/XML間のインピーダンス・ミスマッチ

オブジェクトからXSDを生成すると、以下のような問題が発生する。

  • XSDの拡張が利用できない。
    • stringに対して制約(restriction)をつけるなど。
  • XSDで表現しきれないオブジェクトがある。
    • java.util.TreeMapオブジェクトなど、XSDでは表現しきれない(もしくは実装次第で表現の仕方が異なる)オブジェクトが存在する。
  • Cyclic graphs
    • AがBの参照を持ち、BもAの参照を持つようなオブジェクトからXMLを表現しようとすると、Cyclic graphsな構造となってしまう。
contract-first対contract-last

contract-lastには以下の問題点がある。

  • 変更しづらい
    • オブジェクトからXSDやWSDLを生成するため、オブジェクトに変更が入るとXSDやWSDLが大きく変わってしまう可能性がある。また、オブジェクトを変更していなくても、SOAPスタックを変えた場合もXSDやWSDLまで変わってしまう可能性もある。
  • 再利用性
    • XSDファイルとしての再利用ができない。contract-firstであれば、XSDやWSDLでさえもimportすることが可能。
  • バージョン管理
    • 既存の実装を残しつつ新しい実装を行うためには、Javaでは新しいインタフェース(AirlineServiceに対してAirlineService2など)を用意する必要がある。contract-firstであれば、contractと実装が疎な関係にあるため、同一クラス内で二つのバージョンを実装したり、XSLTで旧メッセージを新メッセージに変換することも可能である。