2012-03-30 14 views
0

JavaEE6、JSF 2.0およびCDIを使用した非常に単純なログインページの作成に忙しいです。 マイログインページは次のように見えます(いくつかのものを明確にするため削除されます):@RequestScoped beanを使用した場合のNullpointer例外

<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を呼び出すとき。両方の入力フィールドは空です。デバッグモードでは、両方のフィールド値が取得されているのがわかります。次に、フィールドに入力して[送信]ボタンを押すと、即時nullpointer例外が発生します。明らかにLoginBeanは最初に(ページが表示されているとき)起動されていますが、コマンドボタンを押すと起動しません。

どうすればよいですか?

+0

NPEのスタックトレースは、ログインメソッドの行を指します。 –

答えて

1

CDI @Injectは、JSF @ManagedBeanでは機能しません。従って、LOGは、nullのままである。

代わりにJSF @ManagedBean

使用CDI @Named、あなたがCDI javax.enterprise.contextパッケージの代わりに、JSF javax.faces.beanから@RequestScoped注釈をインポートすることを確認してください。

+0

注入されたBeanが注入に適格である場合、注入が機能するはずです。他の理由で注射が失敗することがあります。私の賭けはロガーにもあります。 –

+0

コードからすべてのログ機能を一時的に削除しましたが、問題はそのまま残ります。私はまだnullpointer例外を取得します。しかし、@ManagedBeanを削除して@Namedを追加すると、loginbuttonを押すと、 '#{loginBean.userid} 'プロパティでPropertyNotFound例外が発生します。 @Named注釈付きクラスのデフォルト名は、最初の文字が大文字ではなく「loginBean」であるクラス名です。だから、予期せぬことに例外が発生しました。しかし、以前と同じ問題に陥るので、LoginBeanクラスのインスタンスは存在しません。 – HaBa

関連する問題