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?
Der Stack-Trace der NPE zeigt auf eine Zeile in Ihrer Anmeldemethode. –