Come visualizzare gli errori della mia applicazione in JSF?

Nella mia app JSF / Facelets, ecco una versione semplificata di parte del mio modulo:

       

Mi piacerebbe essere in grado di assegnare un errore a un tag h: message specifico in base a qualcosa che accade nel metodo continueButton (). Devono essere visualizzati errori diversi per newPassword e newPassword2. Un validatore non funzionerà realmente, perché il metodo che fornirà i risultati (dal DB) viene eseguito nel metodo continueButton () ed è troppo costoso per essere eseguito due volte.

Non riesco a utilizzare il tag h: messages perché la pagina ha più posizioni di cui ho bisogno per visualizzare diversi messaggi di errore. Quando ho provato questo, la pagina visualizzato duplicati di ogni messaggio.

Ho provato questo come ipotesi migliore, ma senza fortuna:

 public Navigation continueButton() { ... expensiveMethod(); if(...) { FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough.")); } } 

Cosa mi manca? Qualsiasi aiuto sarebbe apprezzato!

FacesContext.addMessage (String, FacesMessage) richiede l’ ID client del componente, non il suo id . Se ti stai chiedendo perché, pensa di avere un controllo come figlio di un dataTable, stampando valori diversi con lo stesso controllo per ogni riga: sarebbe ansible stampare un messaggio diverso per ogni riga. L’ id è sempre lo stesso; il clientId è univoco per riga.

Quindi “myform: mybutton” è il valore corretto, ma l’hard-coding è sconsiderato. Una ricerca creerebbe meno accoppiamenti tra la vista e la logica aziendale e sarebbe un approccio che funziona in ambienti più restrittivi come i portlet.

       

Logica dei bean gestita:

 /** Must be request scope for binding */ public class ShowMessageAction { private UIComponent mybutton; private boolean isOK = false; public String validatePassword() { if (isOK) { return "ok"; } else { // invalid FacesMessage message = new FacesMessage("Invalid password length"); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(mybutton.getClientId(context), message); } return null; } public void setMybutton(UIComponent mybutton) { this.mybutton = mybutton; } public UIComponent getMybutton() { return mybutton; } } 

Nel caso in cui qualcuno fosse curioso, sono riuscito a capirlo in base a tutte le tue risposte combinate!

Questo è in Facelet:

        

Questo è nel metodo continueButton ():

 FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH)); 

E funziona! Grazie per l’aiuto!

Devi anche includere il FormID nella tua chiamata a addMessage ().

  FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough.")); 

Questo dovrebbe fare il trucco.

Saluti.

Ricordatelo:

 FacesContext context = FacesContext.getCurrentInstance(); context.addMessage( null, new FacesMessage( "The message to display in client" )); 

è anche valido, perché quando null è specificato come primo parametro, viene applicato all’intero modulo.

Maggiori informazioni: coreservlets.com // obsoleto

JSF è una bestia. Potrei mancare qualcosa, ma ho usato per risolvere problemi simili salvando il messaggio desiderato su una proprietà del bean e quindi visualizzando la proprietà tramite un outputText:

  

Trovato questo mentre su Google. Il secondo post descrive le diverse fasi di JSF, che potrebbero causare la perdita del messaggio di errore. Inoltre, prova null al posto di “newPassword” perché non hai alcun object con id newPassword.

Ho provato questo come ipotesi migliore, ma senza fortuna:

Sembra giusto per me. Hai provato a impostare una severità dei messaggi in modo esplicito? Inoltre, credo che l’ID debba essere uguale a quello di un componente (cioè, dovresti usare newPassword1 o newPassword2, se questi sono i tuoi ID, e non newPassword come avevi nell’esempio).

 FacesContext.getCurrentInstance().addMessage("newPassword1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message")); 

Quindi utilizzare per visualizzare il messaggio di errore nella pagina JSF.

Risposta semplice, se non è necessario associarlo a un componente specifico …

Giava:

  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, message); 

XHTML: