第1回 SOAPの先進機能を斬る!
SOAPメッセージ・ハンドラーと拡張可能タイプ・マッピング


拡張可能タイプ・マッピング

 JAX-RPCのランタイムは、SOAPメッセージを受信するとメッセージをパースし、SOAPMessageContextを生成して、DOMツリーを構築します(継承インターフェイスであるSOAPElementなどでできたDOMツリー)。しかし、エンドポイントとなるJavaコードは、これらのDOMツリーを操作して動作するわけではなく、エンドポイントが必要なオブジェクトに自動的に変換されることになっています。この処理を行う部分をデシリアライザーといいます。

 入ってきたXMLメッセージ(DOM)をJavaオブジェクトに変換するのをデシリアライザー、JavaオブジェクトをXMLメッセージ(DOM)に変換するのをシリアライザーといいます。XMLとJavaの間の変換は「標準マッピング」とか「デフォルト・マッピング」という呼び方で決められており、それを行うためのデシリアライザーは、JAX-RPCランタイムの標準機能として提供されます。しかしながら、場合によってはこの標準の機能を使わずに自作する必要もあります。例えば、以下のようなことです。

  • 標準のマッピングと違うメッセージ形式(XML)を扱いたい
  • 標準のマッピングでは伝達されない情報を付加したい
  • 汎用デシリアライザーではオーバーヘッドが大きいため、シンプルな専用デシリアライザーを使うことで性能を上げたい

 そこで、デシリアライザーを自作し、交換できるようになっています。これを拡張可能(Extensible)タイプ・マッピングといいます。

 JAX-RPCでは、タイプ・マッピングの管理仕様(フレームワーク)の規定があるのみ(下図を参照)で、デシリアライザーの標準仕様を取り決めていません。つまり、「JAX-RPC標準にのっとったデシリアライザーというのは存在しない」ということです。これが何を意味するかというと、JAX-RPCに対応したサーバーならどのベンダのサーバーでも使えるデシリアライザーというのは作れないということです。こういうことを「ポータビリティー(可搬性)」といいます。現状では、デシリアライザーは、ベンダ依存のモジュールとなってしまうことになり、ポータブルなデシリアライザーは作れません。

 デシリアライザーの可搬性に関しては、次のバージョンで取り扱うことになっています。

Apache SOAP、 Apache Axisでのデシリアライザー

 では、デシリアライザーのフレームワークを古くから持つApache系のSOAPでのデシリアライザーの作成方法を簡単に紹介しましょう。

 Apache SOAPでは、org.apache.soap.util.xml.Serializer(Deserializer)をimplementし、marshall(unmarshall)メソッドを実装する、というのが基本です。実施には、内部で非常に多くのことをやらなければいけないのですが、ユーティリティークラスがそろっていますので、それらを活用します。具体的な方法がdeveloperWorksにありますので参考にしてください(「Apache SOAPの型マッピング)。

 Apache Axisでは、org.apache.axis.encoding.Serializer(Deserializer)をimplementし、serialize(onStartChild)を実装する、という方式です。Axisのデシリアライザーの作成方法は、Axis自体に入っているドキュメントに載っていますし、サンプルも提供されています。

 このように、Apache SOAPとApache Axisでさえ、まったく違う方法となっています。

 いずれも共通なのは、シリアライズのためのメソッド(marshall、serialize)や、デシリアライズのためのメソッド(unmarshall、onStartChild)などは、再帰的に呼ばれるということです。

 今回は、SOAPメッセージ・ハンドラーと拡張可能タイプ・マッピングについて触れました。今後はハンドラーをJAX-RPC準拠で作るのが主流となるでしょう。タイプ・マッピングに関しては、当分の間はベンダ依存のシリアライザーを作ることになり、共通に使えるものを作れるようになるにはもう少し待たなければいけないようです。

2/2  

 米持先進技術塾−@IT分室 

第1回 SOAPの先進機能を斬る!
  Page1
SOAPメッセージ・ハンドラー
Page2
拡張可能タイプ・マッピング

筆者プロフィール
米持幸寿(よねもち ゆきひさ)
1987年に日本アイ・ビー・エム入社。メインフレームOS、ミドルウェアの障害対応、障害解析ソフトウェアの開発、ワークフローシステム開発、オブジェクト指向開発、Web開発などを経験。2000年より、ソフトウェアのテクノロジー・エバンジェリストとして活動中。


米持先進技術工房
テクノロジー・エバンジェリストとして活躍する米持氏が主催する、J2EEの最新技術情報を提供するWebサイト。
http://www-6.ibm.com/jp/developerworks/tips/ytech/


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間