JSF no llena el bean @Named @RequestScoped con valores de entrada enviados

esta es mi primera pregunta en este hermoso sitio. Busqué en Google pero no encontré ninguna solución.

Soy nuevo en JSF y lo estoy aprendiendo con “JSF 2 APIs y JBoss Seam” de Kent Ka lok Tong.

Ahora tengo un problema con una implementación simple de inicio de sesión. Tengo una página de inicio de sesión:

    Login   

Login

y un bean de respaldo:

 package app.controller; import app.model.beans.User; import javax.faces.bean.RequestScoped; import javax.inject.Named; @Named("loginRequest") @RequestScoped public class LoginRequest { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public LoginRequest(){ System.out.println("created " + this.toString()); } public String doLogin(){ if(this.username != null && this.password != null){ if(this.username.equals("user") && this.password.equals("password")){ //this.userHolder.setCurrentUser(username); return "success"; } return "failure"; } return "failure"; } } 

Cuando ejecuto la aplicación, mis propiedades de nombre de usuario y contraseña resultan nulas. Depuré mi aplicación y vi que los métodos setters se invocan correctamente. El problema es que cuando se llama a setUsername hay una instancia de LoginRequest y cuando se llama función setPassword, ¡la instancia es diferente! Parece que la aplicación hace esto:

 obj1 = new LoginRequest() //username and password = null; obj1.username = username; obj1 = new LoginRequest() //username and password = null; obj1.password = password; obj1 = new LoginRequest() //username and password = null; obj1.doLogin(); 

Donde estoy en problemas? ¿Dónde está el error?

¡Muchas gracias!

Atentamente

Marco

De tu frijol:

 import javax.faces.bean.RequestScoped; import javax.inject.Named; @Named("loginRequest") @RequestScoped public class LoginRequest { 

Está mezclando anotaciones CDI y JSF. Puedes y no debes hacer eso. Usa el uno o el otro. No sé qué le dice el libro, pero es muy probable que haya elegido la sugerencia de autocompletar incorrecta durante la importación de la anotación @RequestScoped . Por favor, preste atención a si lo que el IDE sugiere coincide con lo que el libro le indique.

Entonces, debería usar solo anotaciones CDI

 import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named("loginRequest") @RequestScoped public class LoginRequest { 

o solo anotaciones JSF

 import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean(name="loginRequest") @RequestScoped public class LoginRequest { 

De lo contrario, el scope predeterminado es "none" y cada expresión EL que refiera al bean creará una instancia nueva y separada del bean. Con tres expresiones EL que hacen referencia a #{loginRequest} , terminarías con 3 instancias. Uno donde se ha establecido el nombre, uno donde se ha establecido una contraseña y otro en el que se ha invocado la acción.


Sin relación con el problema concreto, el nombre del bean administrado ya está predeterminado en el nombre de clase con la especificación de Javabean de conformidad del primer carácter en minúsculas. Simplemente podría omitir la parte ("loginRequest") completo.