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

21,335

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:

Share:
21,335
hFonti
Author by

hFonti

Updated on February 01, 2020

Comments

  • hFonti
    hFonti about 4 years

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