JSF non popola il bean @Named @RequestScoped con i valori di input inviati

questa è la mia prima domanda in questo bellissimo sito. Ho cercato su Google molto ma non ho trovato alcuna soluzione.

Sono nuovo di JSF e sto imparando con “JSF 2 API e JBoss Seam” di Kent Ka lok Tong.

Ora ho un problema con una semplice implementazione di login. Ho una pagina di accesso:

    Login   

Login

e un fagiolo di supporto:

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

Quando eseguo l’applicazione, le mie proprietà username e password risultano nulle. Ho eseguito il debug della mia app e ho visto che i metodi di setter sono stati correttamente richiamati. Il problema è che quando viene chiamato setUsername c’è un’istanza di LoginRequest e quando viene chiamata la funzione setPassword l’istanza è diversa! Sembra che l’applicazione faccia questo:

 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(); 

Dove sono nei guai? Dov’è l’errore?

Molte grazie!

I migliori saluti

Marco

Dal tuo fagiolo:

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

Stai mescolando le annotazioni CDI e JSF. Puoi e non dovresti farlo. Usa l’una o l’altra. Non so cosa ti stia dicendo il libro, ma molto probabilmente hai scelto il suggerimento di completamento automatico errato durante l’importazione dell’annotazione @RequestScoped . Si prega di prestare attenzione a se qualunque IDE suggerisca che corrisponde a qualsiasi cosa il libro ti dice.

Pertanto, dovresti utilizzare solo le annotazioni CDI

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

o solo annotazioni JSF

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

In caso contrario, l’ambito predefinito è "none" e ogni singola espressione EL che fa riferimento al bean creerebbe una nuova e separata istanza del bean. Con tre espressioni EL che si riferiscono a #{loginRequest} si finirebbe con 3 istanze. Uno in cui è stato impostato il nome, uno in cui è stata impostata la password e uno in cui è stata richiamata l’azione.


Non correlato al problema concreto, il nome del bean gestito ha già il valore predefinito per la class con la specifica Javabean conforms al formato 1a in caratteri minuscoli. Potresti semplicemente omettere la parte ("loginRequest") tutto.