librerias etiquetas ejemplo define componentes jsf-2

jsf 2 - etiquetas - ¿Cómo puedo agregar mensajes de caras durante @PostConstruct?



ui define jsf (3)

En su ejemplo particular, los <p:messages> se representan antes de que el bean administrado se construya por primera vez. Entonces es demasiado tarde para agregar el mensaje. Su bean se construye por primera vez cuando el valor de <h:outputText> se evalúa durante el tiempo de procesamiento.

Debería asegurarse de que el bean se construya antes de que se representen los <p:messages> . En su ejemplo particular, podría lograr esto, por ejemplo, moviendo <h:outputText> antes de <p:messages> . O, agregando una <f:viewAction> o <f:event type="preRenderView"> que se invocan antes de toda la representación, como lo descubrió usted mismo. La adición de mensajes, por lo tanto, no necesariamente tiene que tener lugar en el método de escucha, por cierto.

Ver también:

En el método @PostConstruct de un bean de respaldo, realizo una llamada a un EJB que podría devolver algunos mensajes que deseo mostrar en la página mediante mensajes p :. Sin embargo, incluso si agrego los FacesMessages, por ejemplo, FacesContext.getCurrentInstance (). AddMessage (...), los mensajes de p: no se actualizan con los FacesMessages.

Si en cambio invoco la llamada al EJB en una acción desde la página (digamos que un usuario hace clic en un botón en la página que invoca un método que llama al EJB y luego agrega el FacesMessage (s)), entonces los mensajes aparecen con p : mensajes como se esperaba.

¿Cómo agrego los mensajes de caras durante @PostConstruct y hago que aparezcan cuando la página se renderiza inicialmente?

Código:

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

<h:form> <p:messages showDetail="true" showSummary="true" autoUpdate="true"/> <h:outputText value="#{page1Controller.value}"/> <br/> <p:commandButton value="Trigger Message" actionListener="#{page1Controller.triggerMessage}"/> </h:form>


Para mí, usar el evento preRenderView para mostrar el mensaje en el formulario de inicio fue un infierno de mensajes. Así que creé un "componente" muy simple para mantener los mensajes estáticos. Para este ejemplo solo se admite un mensaje de error.

staticMessage.xhtml:

<ui:fragment xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" rendered="#{rendered}"> <div id="staticMessage" class="ui-messages ui-widget" aria-live="polite"> <div class="ui-messages-error ui-corner-all"><span class="ui-messages-error-icon"/> <ul> <li> <span class="ui-messages-error-summary">#{value}</span> </li> </ul> </div> </div> </ui:fragment>

Incluyendo mensajes:

<ui:include src="/template/components/staticMessage.xhtml"> <ui:param name="rendered"value="#{beanMB.staticMessagesRendered}"/> <ui:param name="value" value="Place your message here."/> </ui:include>


Puede recopilar el error y luego mostrarlo al final de la carga de la página utilizando un RemoteCommand de primefaces con el modo autorun = true. En mi caso, tengo un viewScope y en xhtml muestro la lista de valores que están cargados en @PostConstruct. Si se genera una excepción, la guardaré en la muestra al final de la carga de la página si existe usando el control remoto.

private ArrayList<Exception> 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()); } }

código xhtml

<p:messages id="messages" showDetail="true" autoUpdate="true" closable="true"/> <h:form> <p:remoteCommand id="rcomerror" name="showError" process="@this" autoRun="true" actionListener="#{mBPresentNinos.showPostConstructError()}" /> </h:form>