2012-03-30 26 views
0

當我忙着寫使用JavaEE6,JSF 2.0和CDI一個非常簡單的登錄頁面。 我的登錄頁面,如下所示(有些東西是爲了清楚起見移除):空指針異常使用@RequestScoped豆

<html> 
    <head> 
     <title>HomeBase - Login</title> 
    </head> 
    <body> 
     <h3>Login</h3> 
     <h:form> 
      <div> 
       <label>UserID:</label> 
       <h:inputText value="#{loginBean.userid}" /> 
      </div> 
      <div> 
       <label>Password:</label> 
       <h:inputSecret value="#{loginBean.password}" /> 
      </div> 
      <h:commandButton value="Login" action="#{loginBean.login}" /> 
     </h:form> 
    </body> 
</html> 

和backingbean如下所示:

@ManagedBean 
@RequestScoped 
public class LoginBean implements Serializable { 

    @Inject Logger LOG; 

    private String userid; 

    private String password; 

    public String login() { 
     LOG.info("Start login procedure."); 
     if ("gast".equalsIgnoreCase(userid) && "gast".equals(password)) { 
      SessionBean sessionBean = (SessionBean) FacesContext.getCurrentInstance() 
        .getExternalContext().getSessionMap().get("sessionBean"); 
      User user = new User(); 
      user.setUserid(userid); 
      user.setPassword(password); 
      user.setUsername("Gast"); 
      sessionBean.setUser(user); 
      return "loginSuccess"; 
     } 

     return "loginFailure"; 
    } 

    public String getUserid() { 
     return userid; 
    } 

    public void setUserid(String userid) { 
     this.userid = userid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

現在,當我把它稱爲被正確地顯示loginpage。兩個輸入字段都是空的。在debugmode中,我可以看到兩個fieldvalues的getters都被調用。接下來,我填寫字段並按提交按鈕,併發生立即空指針異常。很顯然,LoginBean在第一次(顯示頁面時)是instatiated的,但不是當我按下commandbutton時。

發生了什麼?

+0

的NPE的堆棧跟蹤將指向你在你的登錄方法的線路。 – 2012-03-30 11:15:10

回答

1

的CDI @Inject不會在JSF @ManagedBean工作。因此LOG仍然null

使用CDI @Named,而不是JSF @ManagedBean,並確保你從CDI導入@RequestScoped註釋javax.enterprise.context包,而不是JSF javax.faces.bean

+0

如果注入的豆有資格注射,注射應該可以工作。由於其他原因,注射可能會失敗。我的賭注也在記錄器上。 – 2012-03-30 18:25:42

+0

我暫時從代碼中刪除了所有日誌記錄功能,但問題保持不變。我仍然得到空指針異常。然而,當我刪除@ManagedBean並添加@Named時,當我按下登錄按鈕時,我在'#{loginBean.userid}'屬性上出現PropertyNotFound異常。 @Named註釋類的默認名稱是第一個字母uncapitalized的類名,它正好是「loginBean」。所以這個異常出現了一些意想不到的情況,但並不是真的,因爲它歸結爲和以前一樣的問題,所以沒有LoginBean類的實例存在。 – HaBa 2012-04-04 08:00:38