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