PrimeFaces: conditional update on validation

10,911

Solution 1

The <h:message> (or PrimeFaces' counterpart <p:message>) is intented for this. Or, in your case maybe better, the <h:messages> (or <p:messages>).

public void submit() {
    // ...

    if (fail) {
        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fail", null));
    }
}

with

<h:messages id="messages" />
<p:commandLink process="@form" action="#{bean.submit}" update="messages something" />

Note that you're as well supposed to use a normal Validator implementation to perform the validation. If it throws a ValidatorException, then the action won't be invoked anyway. Doing validation inside action method is a smell.

Solution 2

I don't think the message suggestion necessarily answers the question asked. Suppose he wants to update something OTHER than a message?

I've not tried this myself, but another approach that might work is to use remotecommand.

<p:remoteCommand id='good' update='goodUpdates'/>  
<p:remoteCommand id='bad' update='badUpdate'/>  
<p:commandButton oncomplete='if (your-test) good() else bad()'/>  

Note, this would necessitate another round-trip to the server and thus performance is a consideration.

Share:
10,911
wrschneider
Author by

wrschneider

Updated on July 15, 2022

Comments

  • wrschneider
    wrschneider almost 2 years

    Is it possible to conditionally update JSF components only when validation succeeds?

    I would like to be able to do something like

    <p:commandLink process="@form" listener="#{foo}" 
      update="something somethingElse"> 
    

    where "something" only gets updated if validation is successful.

    Is there any way that can be done or is that just not supported in JSF?

    I've been able to rig up kind of a hack with hidden commandLinks but not entirely satisfied:

    <p:commandLink process="@form" listener="#{foo}" 
      update="somethingElse" oncomplete="if (!args.validationFailed) $("#link").click();">
    <p:commandLink style="display:none" id="link"
      update="something">