2012-03-30 28 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