[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 メーリングリストの案内