2012-03-30 6 views
0

Я занят написанием очень простой страницы входа с использованием JavaEE6, JSF 2.0 и CDI. Моя страница Войти выглядит следующим образом (некоторые вещи снимается для ясности):Исключение Nullpointer при использовании @RequestScoped bean

<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, я вижу, что получатели для обоих полей являются вызываемыми. Затем я заполняю поля и нажимаю кнопку отправки, и возникает немедленное исключение nullpointer. Очевидно, что LoginBean установлен в первый раз (когда отображается страница), но НЕ, когда я нажимаю кнопку управления.

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

+0

Трассировка стека NPE указывает на линию в вашем методе входа. –

ответ

1

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

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

+0

Инъекция должна работать, если впрыскиваемый бобон имеет право на инъекцию. Инъекция может потерпеть неудачу по другой причине. Моя ставка также включена в регистратор. –

+0

Я временно удалил все функции ведения журнала из кода, но проблема остается прежней. Я все еще получаю исключение nullpointer. Однако, когда я удаляю @ManagedBean и добавляю @Named, я получаю исключение PropertyNotFound в свойстве '# {loginBean.userid}', когда я нажимаю кнопку входа в систему. По умолчанию имя @Named аннотированного класса - это имя класса с его первой буквой, некапитализированной, что является именно «loginBean». Таким образом, исключение оказалось несколько неожиданным, хотя на самом деле это не так, поскольку оно сводится к той же проблеме, что и раньше, нет экземпляра класса LoginBean. – HaBa

Смежные вопросы