validationjsflifecycleimmediate-attribute

JSF skip Required-Validation without immediate=true


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?


Solution

  • 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)