[Seasar-user:7904] Re: [Seasar,Teeda]Session破棄時のセッションDto参照で例外発
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 5月 29日 (火) 20:00:43 JST
小林 (koichik) です.
Date: Tue, 29 May 2007 17:46:55 +0900
From: <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:7897] Re: [Seasar,Teeda]Session破棄時のセッションDto参照で例外発
> ただ、セッションが破棄時点での
> sessionDestroyedメソッドでは、
> 取得しようとしてもNullになるので、
> S2 コンテナがインスタンスを生成してセッションに
> 設定したものは、
> セッション破棄状態では
> 取得する方法が無いのか、
> お伺いしたしだいです。
S2 コンテナが session や request 属性の
コンポーネントを扱うことができるのは,
外部コンテキストが適切に設定されている
場合のみとなります.
Web アプリケーションでは通常,S2 が提供する
S2ContainerFilter によってその設定が行われます.
しかし,sessionDestroyed() メソッドは通常の
リクエスト処理の中で呼び出される物ではないため,
S2ContainerFilter は経由しません.
そのために外部コンテキストが設定されず,
request や session のコンポーネントを扱うことは
できません.
回避策としては,sessionDestroyed() メソッドの中で
外部コンテキストを設定するのが適当だと思いますが,
少々手間がかかります.
まずは HttpServletRequest の実装クラスが必要です.
S2 の MockHttpServletRequestImpl を継承するのが
簡単だと思います.
public class MyServletRequest extends MockHttpServletRequestImpl {
private HttpSession session;
public MyServletRequest(HttpSession session) {
super(null, "/view");
this.session = session();
}
public HttpSession getSession(boolean create) {
return session;
}
}
後は sessionDestroyed() メソッドの中で外部コンテキストの
設定を行います.
public void sessionDestroyed(HttpSessionEvent se) {
S2Container container = SingletonS2ContainerFactory.getContainer();
ExternalContext externalContext = container.getExternalContext();
if (externalContext == null) {
throw new EmptyRuntimeException("externalContext");
}
externalContext.setRequest(new MyServletRequest(se.getSession()));
try {
//本来の処理
} finally {
externalContext.setRequest(null);
}
}
メーラのエディタで書いただけで検証していませんが,
このようにすることで sessionDestroyed() の中でも
session スコープのコンポーネントが利用できると
思います.
--
<signature>
<name>Koichi Kobayashi</name>
<e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>
Seasar-user メーリングリストの案内