我正忙着使用JavaEE6,JSF 2.0和CDI编写一个非常简单的登录页面。 我的登录页面如下所示(为清楚起见,删除了一些内容):
<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>
,backbean如下所示:
@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;
}
}
现在,当我调用登录页面时,它会正确显示。两个输入字段都是空的。在debugmode中,我可以看到两个fieldvalues的getter都被调用了。接下来,我填写字段并按下提交按钮,立即发生nullpointer异常。显然,LoginBean是在第一次(显示页面时)实例化的,但是当我按下命令按钮时则不是。
发生了什么?
答案 0 :(得分:1)
CDI @Inject
在JSF @ManagedBean
中不起作用。因此LOG
仍为null
。
使用CDI @Named
代替JSF @ManagedBean
,并确保从CDI @RequestScoped
包而不是JSF javax.enterprise.context
导入javax.faces.bean
注释。