Исключение Nullpointer при использовании bean-компонента @RequestScoped

я занят написанием очень простой страницы входа с использованием 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>

и 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;
    }
}

Теперь, когда я вызываю страницу входа, она отображается правильно. Оба поля ввода пусты. В режиме отладки я вижу, что вызываются геттеры для обоих значений полей. Затем я заполняю поля и нажимаю кнопку отправки, и возникает немедленное исключение нулевого указателя. Очевидно, что LoginBean запускается в первый раз (когда отображается страница), но НЕ когда я нажимаю кнопку команды.

Что случилось?


person HaBa    schedule 30.03.2012    source источник
comment
Трассировка стека NPE укажет вам на строку в вашем методе входа в систему.   -  person Matt Handy    schedule 30.03.2012


Ответы (1)


CDI @Inject не работает в JSF @ManagedBean. Следовательно, LOG остается null.

Используйте CDI @Named вместо JSF @ManagedBean и убедитесь, что вы импортируете аннотацию @RequestScoped из пакета CDI javax.enterprise.context вместо JSF javax.faces.bean.

person BalusC    schedule 30.03.2012
comment
Инъекция должна работать, если инжектируемый компонент подходит для инъекций. Инъекция может быть неудачной по какой-то другой причине. Моя ставка также на регистратора. - person Matt Handy; 30.03.2012
comment
Я временно удалил все функции ведения журнала из кода, но проблема осталась прежней. Я все еще получаю исключение nullpointer. Однако, когда я удаляю @ManagedBean и добавляю @Named, я получаю исключение PropertyNotFound для свойства #{loginBean.userid}, когда я нажимаю кнопку входа. Имя по умолчанию для аннотированного класса @Named — это имя класса с первой буквой без заглавных букв, что в точности соответствует loginBean. Таким образом, исключение возникло несколько неожиданно, хотя и не совсем так, поскольку оно сводится к той же проблеме, что и раньше: отсутствует экземпляр класса LoginBean. - person HaBa; 04.04.2012