[Seasar-user:15773] Re: HELP:sastruts(1.0.4)+s2mai(0.9.6) で例外発生、対処法をご教授頂きたい。

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 9月 18日 (木) 18:00:24 JST


小林 (koichik) です.

Date:    Thu, 18 Sep 2008 15:45:38 +0900
From:    Yasuo Higa <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15771] Re: HELP:sastruts(1.0.4)+s2mai(0.9.6) で例外発生、対処法をご教授頂きたい。

> > 初回は正常にメール送信されるがそのまま続けて2回目のメール送信
> > では下記のような例外が発生してしまいます。
(略)
> S2Maiが、HOT deployに対応していないのかもしれませんね。

S2Mai は HOT deploy 対応していたはず.

おそらく Action または Mai のどちらかが 
session スコープになっていると思うのですが,
それが原因だと思います.


S2Mai の Mai インタフェースは AOP が適用されますが,
HOT deploy の元では AOP が適用されたクラス
(QuestionMai$$EnhancedByS2AOP$$1e4c806) は
2 回目のリクエストでは参照することができません.

そして Action が (おそらく) session スコープで
あるために,2 回目のリクエストでリビルドされ,
フィールドに保持されていた Mai も復元しようと
しますが,QuestionMai$$EnhancedByS2AOP$$1e4c806 は
すでに参照できないためリビルドできず,そのまま
フィールドに設定しようとします.

しかし,Action のフィールドの型は新しい 
HotdeployClassLoader でロードされた QuestionMai なので,
古い HotdeployClassLoader でロードされた QuestionMai を
implements した QuestionMai$$EnhancedByS2AOP$$1e4c806 を
代入することはできず,今回の現象になっていると思われます.


回避策ですが,Action を session にしているなら,
(デフォルトの) request にすれば回避できると
思います.
あるいは,Mai が session スコープになっているなら
それを (デフォルトの) singleton に.

session に保持する情報があるなら,Action や
Mai を直接 session スコープにするのではなく,
session スコープの Dto を DI してもらうように
するのが無難です.


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