JSF skip Required-Validation without immediate=true

dognose picture dognose · Jan 15, 2013 · Viewed 50.1k times · Source

I have multiple forms, where I have mandatory fields and optional fields.

To submit such a form I require the validation on the required-attribute to be executed, which works fine. To cancel such a form I use the attribute immediate="true" on the p:commandbutton, which makes its action happen during the Apply Request Values-Phase as addressed here: How to skip validation when a specific button is clicked?

However, for large forms I want to provide the user with a Save-Button, so he can proceed later.

For just saving the current state I also want to ignore the validation of the required-attribute. However, using immediate="true" is not working, because then my save method simple saves nothing, because the JSF lifecycle never hits the "UpdateModelValues"-Phase. (Acording to http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html )

So, how to bypass the required-check but not skip half the lifecycle?

Answer

dognose picture dognose · Jan 15, 2013

Each Button creates an entry inside the Param-List as long as it's member of the form. So I simple applied a check for the presence of that entry to the "required" parameter:

<h:form id="form" prependId="true">
...
<p:inputText id="someId"
    required="#{param['form:save']==null}" ... />
...
<p:commandButton id="save" value="Save" />
<p:commandButton id="submit" value="Submit" />
<p:commandButton id="cancel" value="Cancel" immediate="true" />
</h:form>

When I click "Submit" the param['form:save'] is NULL, which then turns the expression to true so the validation is executed.

When I click "Save" the param['form:save'] is NOT NULL (but empty!), which resolves to false so the validation is ignored. (Or let's say JSF thinks it is not a required field due to the expression beeing evaluated to false)