0

前の質問に続きますが、アプリケーションのセッションが最初に開始されたときに、セッション スコープの JSF Bean を初期化しようとしています。そのため、Web アプリケーションで最初にアクセスしたページに関係なく、ユーザーは Bean を使用できます。私のカスタムリスナー:

public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                .get("mySessionBean") == null) {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                    .put("mySessionBean", new MySessionBean());
        }
    }
}

ただし、これによりスタック オーバーフロー エラーが発生します。put()クラスのメソッドがSessionMap新しい を作成しようとしているように見えるHttpSessionため、リスナーで無限ループが発生します。アプリケーションのセッションが最初に開始されたときに、この問題に遭遇することなく JSF セッション スコープ Bean を初期化するにはどうすればよいですか?

WebSphere 7で実行されているSpring 3でJSF 2を使用しています。

ありがとう!

4

1 に答える 1

2

その時点では、セッションの作成は完全には完了していません。リスナーメソッドが終了した場合にのみ、セッションはコンテキストに入れられ、request.getSession()JSFgetSessionMap()が内部で使用しているために利用可能になります。

event代わりに、引数からセッションを取得して、そのsetAttribute()メソッドを使用する必要があります。JSFは、セッションスコープのマネージドBeanをルックアップしてそこに格納し、すでに存在する場合は新しいBeanを作成しません。

public void sessionCreated(HttpSessionEvent event) {
    event.getSession().setAttribute("mySessionBean", new MySessionBean());
}

その時点でセッションBeanがすでに存在することは不可能であるため、余分なnullcheckを削除したことに注意してください。


具体FacesContext的な問題とは関係なく、実際には、JSFによって管理されていない実装に存在することに依存してはなりません。JSF以外のリクエスト中にセッションが作成される可能性は十分にあります。

于 2011-11-01T01:20:10.960 に答える