S2DWRをちょっとずつ進めてみる

とりあえず冬休みになったので、DWRと戯れています。まずは、竹添さんのコードを参考にS2Creatorを作りつつ、気になっていたDWRから呼び出すコンポーネントアスペクトをかけるとListやMapなどのジェネリクス対応がうまくいかなくなる問題の調査です。

最初にDWRの調査。Java1.4の場合ジェネリクスがなかったのでListやMapの中に入れるべきインスタンスが特定できません。そのためにdwr.xmlという設定にJava5に似た構文で型の情報を定義できるようになっています。Java5の場合は、ジェネリクスを使っていれば、そこから情報を取ってくれるようです。

ところが、S2AOPを使った場合にこの処理がうまく動かなくなります。Java1.4の場合は、設定に書かれたクラス・メソッドと型を関連づけて保持しているので、S2AOPがエンハンスしたクラスの場合、元のクラスと異なるため設定が見つけられなくなります。

また、Java5の場合はエンハンスした結果できたサブクラスにジェネリクスの情報が引き継がれていないため、Java1.4と同じ状況になってしまいます。

この問題に対応するため、以下の日記では型情報を探しにいく時に、対象がエンハンスした結果できたサブクラス(クラス名に$$EnhancedByS2AOP$$を含む)の場合にスーパークラスを探して、そっちを処理されています。

http://d.hatena.ne.jp/masapon1967/20060831/1157086213

これを参考にやろうとしたのですが、DWR1.xと2.xでコードが変わっていて、同じ方法は使えませんでした。仕方なく、インバウンド処理の中でやることにしました。具体的には、インバウンド時に呼び出されるHtmlCallMarshallerとPlainCallMarshallerをそれぞれサブクラス化し、その中で型情報を取得する時にスーパークラスを参照することを考えています。

ただ、この実装が果たしてよいのかどうか、まだちょっと迷いがあります。今のところ、このタイミングでいい気はしているのですが、本当に他にないのかどうか。。。 もうちょっと他のコードを書きつつ悶々としてみます。