2012-03-30 7 views
0

Ich bin beschäftigt, eine sehr einfache Anmeldeseite mit JavaEE6, JSF 2.0 und CDI zu schreiben. Meine Login-Seite sieht wie folgt aus (einige Sachen sind aus Gründen der Klarheit entfernt):Nullpointer-Ausnahme bei Verwendung von @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> 

und die backingbean sieht wie folgt aus:

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

Nun, wenn ich die Loginpage nenne es richtig angezeigt wird. Beide Eingabefelder sind leer. Wenn ich im Debugmodus bin, kann ich sehen, dass die Getter für beide Feldwerte aufgerufen werden. Als nächstes fülle ich die Felder aus und drücke den Submit-Knopf und es kommt zu einer sofortigen Nullpointer-Ausnahme. Natürlich wird die LoginBean das erste Mal gestartet (wenn die Seite angezeigt wird), aber NICHT, wenn ich die Befehlsschaltfläche drücke.

Was ist passiert?

+0

Der Stack-Trace der NPE zeigt auf eine Zeile in Ihrer Anmeldemethode. –

Antwort

1

Das CDI @Inject funktioniert nicht in einem JSF @ManagedBean. Daher LOG bleibt null.

Verwendung CDI @Named statt JSF @ManagedBean und stellen Sie sicher, dass Sie @RequestScoped Annotation von CDI javax.enterprise.context Paket anstelle von JSF javax.faces.bean importieren.

+0

Die Injektion sollte funktionieren, wenn die injizierte Bean für die Injektion geeignet ist. Die Injektion könnte aus einem anderen Grund fehlschlagen. Meine Wette ist auch auf dem Logger. –

+0

Ich habe vorübergehend alle Protokollierungsfunktionen aus dem Code entfernt, aber das Problem bleibt gleich. Ich bekomme immer noch die Nullpointer-Ausnahme. Wenn ich jedoch @ManagedBean lösche und @Named hinzufüge, erhalte ich eine PropertyNotFound-Ausnahme für die Eigenschaft '# {loginBean.userid}', wenn ich die Login-Taste drücke. Der Standardname einer annotierten Klasse @Named ist der Klassenname mit dem ersten nichtkapitalisierten Buchstaben, der genau "loginBean" ist. Die Ausnahme kam also etwas unerwartet, aber nicht wirklich, da es sich um das gleiche Problem wie zuvor handelt. Es gibt keine Instanz der LoginBean-Klasse. – HaBa