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