Search code examples
jsf-2primefaces

<p:growl> not executing on <p:wizard> FlowListener


I have a JSF page that contains a growl message with primefaces Wizard component. The Wizard contains a FlowListener attribute. On the Flowevent, the growl message should fire however it is not. The FlowListener is working because code not related to updating the growl message is being executed however the growl message is not being displayed. Any help in fixing this is appreciated.

Using: JSF Mojarra 2.2, Primefaces 4.0, Galssfish 4

My JSF code:

<h:form>    

    <p:growl id="growl" showDetail="true" />    

    <p:wizard flowListener="#{reviewBean.handleFlow}" >

        <p:tab id="Contact" title="Contact Details" >               
            <p:panel header="#{reviewBean.contactInstr}" >
                <p:messages />
                <h:panelGrid columns="2" >

                    <h:outputText value="Address: " />
                    <p:inputText  value="#{reviewBean.contactData.address1}" required="true" 
                                    requiredMessage="Address is required" size="50" />

                    <h:outputText value="Address: " />
                    <p:inputText  value="#{reviewBean.contactData.address2}" size="50" />

                    <h:outputText value="City: " />
                    <p:inputText  value="#{reviewBean.contactData.city}" required="true" 
                                    requiredMessage="City is required" size="50"/>

                    <h:outputText value="State: " />
                    <p:selectOneMenu value="#{reviewBean.contactData.state}" >              
                        <f:selectItems value="#{reviewBean.contactData.stateOptions}" />                                                    
                    </p:selectOneMenu>

                    <h:outputText value="Zip: " />
                    <p:inputText  value="#{reviewBean.contactData.zip}" required="true" 
                                        requiredMessage="Zip is required" size="50" />                      

                </h:panelGrid>
            </p:panel>              
        </p:tab>

        // Additional tabs omitted .........

    </p:wizard>
</h:form>

FlowListener from my Bean:

public String handleFlow(FlowEvent event) {

    String currentStepId = event.getOldStep();                              // get current tab
    String stepToGo = event.getNewStep();                                   // get next tab in Flow
    RequestContext request = RequestContext.getCurrentInstance();
    FacesContext context = FacesContext.getCurrentInstance();

    switch (currentStepId) {

        case "Contact": 

            // Save user entered contact information to database 
            datalist.saveContact(contactData, user.getId());            
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Data Saved",  "") );
            request.update("growl");
            break;

         // remaining cases omitted ........


    }

    return stepToGo;            // return next tab in Flow
}

Solution

  • request.update("growl");
    

    This is the wrong part.

    Put an id to your form, then reference it like

    i.e

    request.update("your_form_id:growl");
    

    Alternatively you could activate the auto-update feature of the growl with the attribute autoUpdate="true" of the growl component, and remove the request.update() method call in your backing bean.