[Seasar-user:4847] Re: [S2Axis]Mapの送受信が期待通りに動作しない
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2006年 10月 21日 (土) 20:00:26 JST
小林 (koichik) です.
調査に時間がかかって変身^h^h返信が遅くなりました.m(__)m
Date: Thu, 19 Oct 2006 12:26:04 +0900
From: [E-MAIL ADDRESS DELETED]
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:4821] [S2Axis]Mapの送受信が期待通りに動作しない
> ■問題
> Map を送受信するサービスを作成したところ、期待通りの
> 動作をしない。TCP モニタで送信メッセージを確認すると、
>
> ・送信時
> Map の中身が空となっている。
S2Axis にはクライアント側でタイプマッピングを追加する機能が
なかったので,AxisConnector に addTypeMapping(TypeMappingDef)
メソッドを追加します.
以下のように設定できるようになります.
<component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
<property name="baseURL">
"http://localhost:8080/s2axis-examples/services/"
</property>
<initMethod name="addTypeMapping">
<arg>
<component class="org.seasar.remoting.axis.TypeMappingDef">
<property name="type">@[E-MAIL ADDRESS DELETED]</property>
<property name="namespaceURI">"http://xml.apache.org/xml-soap"</property>
<property name="localPart">"Map"</property>
<property name="serializer">@[E-MAIL ADDRESS DELETED]</property>
<property name="deserializer">@[E-MAIL ADDRESS DELETED]</property>
</component>
</arg>
</initMethod>
</component>
> ・受信時
> Map の持つ値の型が、base64Binary となっている。
> 受信すると、空文字として受け取ってしまう。
これはおそらく,Axis の問題ではないかと思います.
Axis および JAX-RPC では chain of responsibility に基づいた
タイプマッピングのチェーンを利用するのですが,タイプマッピングの
自動登録を有効にしている場合に Java 型から対応するシリアライザを
(Axis が) 取得しようとすると,java.lang.String のような基本型でも
BeanSerialzar へのマッピングを自動登録してしまうため,base64 で
シリアライズされてしまっていました.
Axis の標準的な使い方ではタイプマッピングの自動登録は有効に
なっていないため,問題にならないのだと思われます.
とりあえず,S2Axis の方でこの問題を回避するようにします.
なお,Map に対するシリアライザ・デシリアライザは Axis の
typeMappingVersion を 1.3 として利用するとデフォルトで
登録されるようです.
typeMappingVersion は Axis エンジンのグローバルプロパティで
設定可能になっているのですが,S2Axis ではこの設定をタイプ
マッピングに反映していなかったので,この機能も追加しました.
これにより,server-config.wsdd および client-config.wsdd に
<globalConfiguration>
・・・
<parameter name="typeMappingVersion" value="1.3"/>
のように記述することで,タイプマッピングの登録をすることなく
Map の送受信を行うことができます.
ただし,タイプマッピングが JAX-RPC 1.1 互換になるようなので,
.NET などと接続する場合は十分に検証する必要があるかもしれません.
Axis 同士ならクライアントとサーバ側の typeMappingVersion が
同じであれば概ね問題ないのではないかと思いますが.
そんなわけで (どんなわけで?),以上の対応を行った暫定版の
Jar ファイルを以下に置きました.
http://s2axis.seasar.org/download/2006-10-21/s2axis-1.0.3-SNAPSHOT.jar
http://s2axis.seasar.org/download/2006-10-21/s2axis-1.0.3-sources-SNAPSHOT.jar
ご確認頂けると幸いです.
こちらでは Axis 1.3 および 1.4 の両方で,タイプマッピングの
登録をした場合と typeMappingVersion を 1.3 にした場合の
いずれでも Map の送受信が行えることを確認しました.
これで問題がなければ S2Axis-1.0.3 としてリリースします.
よろしくお願いします.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内