
第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全記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
![]() |
|
|
|
![]() |