Come posso aggiungere Faces Messages durante @PostConstruct

Nel metodo @PostConstruct di un bean di supporto, effettuo una chiamata a un EJB che potrebbe restituire alcuni messaggi che desidero visualizzare sulla pagina tramite p: messages. Tuttavia, anche se aggiungo FacesMessages, ad esempio FacesContext.getCurrentInstance (). AddMessage (…), p: i messaggi non vengono aggiornati con FacesMessages.

Se invece invoco la chiamata al bean su un’azione dalla pagina (ad esempio, un utente fa clic su un pulsante sulla pagina che richiama un metodo che chiama EJB e quindi aggiunge FacesMessage), i messaggi vengono visualizzati utilizzando p : messaggi come previsto.

Come aggiungo Faces Messages durante @PostConstruct e li faccio vedere quando la pagina viene inizialmente resa?

Codice:

Page1Controller.java:

@ManagedBean public class Page1Controller { @PostConstruct public void init() { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Test Message from @PostConstruct")); } public String getValue() { return "Some Value"; } public void triggerMessage(ActionEvent event) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Test Message from Trigger Button")); } } 

page1.xhtml

   


Nel tuo particolare esempio, viene eseguito il rendering prima che il bean gestito sia costruito per la prima volta. È quindi troppo tardi per aggiungere il messaggio. Il tuo bean viene costruito per la prima volta quando il valore di è stato valutato durante il tempo di rendering.

Dovresti in qualche modo assicurarti che il bean sia costruito prima che venga eseguito il rendering di . Nel tuo esempio particolare, puoi ottenere questo risultato spostando ad esempio prima di . Oppure, aggiungendo o che viene richiamato prima dell’intero rendering, come hai scoperto tu stesso. A proposito, l’aggiunta di messaggi non deve necessariamente avvenire nel metodo listener.

Guarda anche:

  • Per cosa possono essere usati , e ?

È ansible raccogliere l’errore e visualizzarlo al termine del caricamento della pagina utilizzando un comando remoto di primefaces con la modalità autorun = true. Nel mio caso ho un viewScope e in xhtml mostro la lista di valori che sono caricati nel @PostConstruct. Se viene generata un’eccezione, la salverò nell’esempio alla fine del caricamento della pagina, se esiste utilizzando il comando remoto.

 private ArrayList postConstucError = new ArrayList<>(); @PostConstruct public void validarAcceso() { /** * verificar permisos a la vista de coeficientes */ try { this.init() //load data; } catch (Exception e) { System.out.print(e.getMessage()); this.postConstucError.add(e); } } public void showPostConstructError() { try { for (int i = 0; i < this.postConstucError.size(); i++) { JsfUtil.addErrorMessage("Error al cargar datos iniciales: " + postConstucError.get(i).getMessage()); } } catch (Exception e) { JsfUtil.addErrorMessage(e, "Error: showPostConstructError() " + e.getMessage()); } } 

codice xhtml

      

Per me, usare l’evento preRenderView per visualizzare il messaggio sul form init era un messaggio infernale. Così ho creato un “componente” molto semplice per mantenere i messaggi statici. Per questo esempio è supportato solo un messaggio di errore.

staticMessage.xhtml:

  
  • #{value}

Inclusi messaggi: