1

私は自分のページを介してSessionBeanのスコープを維持しようとしています。このために、ここからいくつかのチュートリアルに従いました。実際には、次のコードのように、ExternalContextを介してセッションを取得しようとしています:

public class LoginFilter implements Filter{

ProfileBean pBean = new ProfileBean();
ActiveUserModel activeUserModel;
ExternalContext tmpEC;
Map sMap;      

public void destroy() {}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    tmpEC = FacesContext.getCurrentInstance().getExternalContext();
    sMap = tmpEC.getSessionMap();
    activeUserModel = (ActiveUserModel) sMap.get("ActiveUserModel");        

    String username = SecurityAssociation.getPrincipal().getName();              

    if(activeUserModel.getUsername() == null)
    {
        try {
            pBean.consultaProfile(username);            

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        } 
    }else{
        }        

    filterChain.doFilter(servletRequest, servletResponse);      
}

public void init(FilterConfig filterConfig) throws ServletException {}

}

この行の if(activeUserModel.getUsername() == null) では、Bean をインスタンス化していないため、java.lang.NullPointerException が発生しますが、インスタンス化しても機能しませんでした。

何かがおかしい?

4

2 に答える 2

5

JSFリクエストに対して、JSFアーティファクト(、、、など)のコンテキスト外でオブジェクトを取得できないためFacesContext、NPEを取得しています。その結果、その行の後に null と評価されます@ManagedBean@FacesConverter@FacesComponentPhaseListenersMap

FacesContextそもそもなぜセッションを探しに行くことを選択したのかわかりません. これも同じように簡単に行うことができます:

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    //Get a hold of the http request
    HttpServletRequest req = (HttpServletRequest)request; 

    //Access the HttpSession associated with the request
    HttpSession session =  req.getSession(false);  

    //Take what you want from the session
    activeUserModel = (ActiveUserModel) session.getAttribute("ActiveUserModel");         

    String username = SecurityAssociation.getPrincipal().getName();              

       if(activeUserModel.getUsername() == null) {
          try {
           pBean.consultaProfile(username);            

          } catch (SQLException e) {
            e.printStackTrace();
          } catch (NamingException e) {
            e.printStackTrace();
          } 
          }else{
        }        

      filterChain.doFilter(servletRequest, servletResponse);      
     }

SessionScopeすでにご存知のように、JSF の は のファサードですHttpSession。したがって、探索していた回り道の代替案とは対照的に、基本に到達してHttpSessionすべての変数を簡単に取得できます。@SessionScopedFacesContext

于 2013-04-30T23:48:15.277 に答える
1

セッション スコープの Bean が null の場合は、単にセッション用にまだ作成されていないことを意味します。これは、新しいセッションの最初のリクエスト中に発生する可能性があります。自分で作成し、自分でセッションスコープに入れる必要があります。JSF は、セッションの残りの部分でそれを再利用します。

セッション スコープの Bean を取得する方法は少し不器用です。JSF のフードの下から生のサーブレット API を取得しています。ExternalContext#getSessionMap()セッション属性を管理するために使用することもできます。

Map<String, Object> sessionMap = externalContext.getSessionMap();
LoginBean loginBean = (LoginBean) sessionMap.get("loginBean");
if (loginBean == null) {
    loginBean = new LoginBean();
    sessionMap.put("loginBean", loginBean);
}
// ...

Bean を PhaseListener のインスタンス変数として宣言しないでください。つまり、アプリケーションの存続期間全体で単一の PhaseListener インスタンスが存在するため、すべてのインスタンス変数がすべてのリクエスト/セッション間で共有されます。つまり、スレッドセーフではありません。

于 2013-04-30T21:37:46.290 に答える