h:messages does not display messages when p:commandButton is pressed

jsf, message, primefaces

Solution

You're sending an ajax request with PrimeFaces `<p:commandButton>`. Ajax requests have by default no form of feedback (unless PrimeFaces' `autoUpdate="true"` is been used somewhere). You should be explicitly specifying parts of the view which you'd like to update on ajax response.

One way is specifying the `update` attribute on `<p:commandButton>` to point to the client ID of the `<h:messages>` component.

<h:messages id="messages" ... />
<h:form>         
    <p:commandButton ... update=":messages" />
</h:form>

Another way is to replace it by PrimeFaces `<p:messages>` which has an `autoUpdate` attribute for the purpose of automatic update on ajax response.

<p:messages ... autoUpdate="true" />
<h:form>         
    <p:commandButton ... />
</h:form>

A completely different alternative is to turn off ajax by adding `ajax="false"` attribute to the button, this way a synchronous postback will be performed which effectively results in a full page update, exactly like as how the standard JSF `<h:commandButton>` behaves when used without `<f:ajax>`.

<h:messages ... />
<h:form>         
    <p:commandButton ... ajax="false" />
</h:form>

See also:

- Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes

Problem

I have a problem with the h:messages tag in JSF that simply does not show any messages. In the Glassfish log are no errors when I click the button. The setup is as follows: test.xhtml: ``` <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:j="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </h:head> <h:body> <h:messages globalOnly="true"/> <h:form id="loginform"> <p:commandButton id="testButton" value="Test" action="#{loginSessionBean.test()}" /> </h:form> </h:body> </html> ``` With The SessionScopedBean: ``` @ManagedBean @SessionScoped public class LoginSessionBean implements Serializable { private static final long serialVersionUID = 1L; ... public String test(){ FacesContext fc = FacesContext.getCurrentInstance(); fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Test!", null)); return ""; } ```

Original source

Related problems