使用@RequestScoped bean时出现Nullpointerexception

时间:2012-03-30 11:04:22

标签: jsf-2 nullpointerexception java-ee-6 managed-bean

我正忙着使用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是在第一次(显示页面时)实例化的,但是当我按下命令按钮时则不是。

发生了什么?

1 个答案:

答案 0 :(得分:1)

CDI @Inject在JSF @ManagedBean中不起作用。因此LOG仍为null

使用CDI @Named代替JSF @ManagedBean,并确保从CDI @RequestScoped包而不是JSF javax.enterprise.context导入javax.faces.bean注释。