SAStrutsでAOPを使ってセッションタイムアウトの処理を実装しようとしていた時のこと。
HttpSession session = SingletonS2Container.getComponent( HttpSession.class );
LoginUser loginUser = (LoginUser) session.getAttribute("loginUser");
こんな感じのコードでClassCastExceptionが投げられた。
ちなみにLoginUserクラスは訳あって、
@Component(instance = InstanceType.SESSION)
を使わずに、HttpSession.setAttribute()で直に管理しています。
Sessionの取り方を以下のように変えても駄目でした。
HttpSession session = (HttpSession) SingletonS2ContainerFactory.getContainer().getExternalContext().getSession();
以下でも駄目。
Map<String, Object> sessionScope = SingletonS2Container.getComponent("sessionScope");
どうして駄目なんだろうと思って調べてみると、以下の記事が見当たりました。
http://d.hatena.ne.jp/learn/20090318
なるほど。
同一クラスでもクラスローダーが異なれば、違うクラスとして扱われる。
SMART deploy対象外のクラスからSMART deploy対象のクラスを参照していたわけね。
とりあえず理由はわかったので、一時的措置として以下のように対処しておいた。
if (sessionScope.get("loginUser") == null) {
//セッションタイムアウト時の処理
}
やはり、SMART deploy対象外クラスとして切り分けたほうがいいのかな。