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