[Seasar-user:12208] Re: [Teeda] セッションタイムアウト時にActionクラスのdoメソッドにAOPがかからない
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 12月 19日 (水) 17:00:35 JST
小林 (koichik) です.
Date: Wed, 19 Dec 2007 15:57:44 +0900
From: 松崎 学 <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:12200] Re: [Teeda] セッションタイムアウト時にActionクラスのdoメソッドにAOPがかからない
> Filterでチェックするようにしてみたのですが、
> Hot Deployで動かすとLinkageErrorが出てしまいます。Coolの時はOKでした。
> 作成したFilterはweb.xmlの定義でfilterの最後に追加してます。
> また、現在はdbsessionも使用しています。
>
> クラスローダ関連だと思うのですが、クラスローダについて詳しくないので、
> LinkageErrorが発生する理由と対応方法をお教えいただけると助かります。。。
Tomcat の提供する ClassLoader と,HotdeployClassLoader が
同じクラスをロードしてしまった場合によく発生します.
Filter は HOT deploy 非対象なので,そこで
いろいろなクラスを参照すると問題が起こりやすく
なります.
Filter では極力処理を行わず,コンテナから
Service なり Helper なりを取得して処理を任せるのが
無難だと思います.
その Service なり Helper なりのインタフェースは
Callable など汎用的なインタフェースにすると
安全です.
SessionCheckService service =
SingletonS2Container.getComponent(SessionCheckService.class);
のようにすると,SessionCheckService が Tomcat の
ClassLoader にロードされてまた微妙な問題に
つながるかもしれないので,
Callable<Boolean> service =
(Callable<Boolean>) SingletonS2Container.getComponent("sessionCheckService");
のようにするとおそらく問題ないと思います.
Callble がイマイチの場合は独自の interface を
用意してもいいのですが,それは HOT deploy
非対象となるように,ルートパッケージから
外してください.
実装クラスはルートパッケージ以下に置いて,
そのクラス名から求められるコンポーネント名で
コンテナから取得してください.
ルートパッケージが foo だとすると,
package bar;
public interface SessionChecker {
...
}
package foo;
public class SessionCheckService implements SessionChecker {
...
}
SessionChecker service =
(SessionChecker) SingletonS2Container.getComponent("sessionCheckService");
という感じ.
--
<signature>
<name>Koichi Kobayashi</name>
<e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>
Seasar-user メーリングリストの案内