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