Class ValidateMultipleFields

  • All Implemented Interfaces:
    PartialStateHolder, StateHolder, TransientStateHolder, ComponentSystemEventListener, FacesListener, SystemEventListenerHolder, EventListener, MultiFieldValidator
    Direct Known Subclasses:
    ValidateAll, ValidateAllOrNone, ValidateEqual, ValidateMultiple, ValidateOne, ValidateOneOrMore, ValidateOneOrNone, ValidateOrder, ValidateUnique

    public abstract class ValidateMultipleFields
    extends ValidatorFamily
    implements MultiFieldValidator
    Base class which is to be shared between all multi field validators. The implementors have to call the super constructor with the default message. The implementors have to override the MultiFieldValidator.validateValues(FacesContext, List, List) method to perform the actual validation.

    General usage of all multiple field validators

    This validator must be placed inside the same UIForm as the UIInput components in question. The UIInput components must be referenced by a space separated collection of their client IDs in the components attribute. Since version 3.13 you can also specify a single client ID of a common parent. This validator can be placed anywhere in the form, but keep in mind that the components will be converted and validated in the order as they appear in the form. So if this validator is been placed before all of the components, then it will be executed before any of the component's own converters and validators. If this validator fails, then the component's own converters and validators will not be fired. If this validator is been placed after all of the components, then it will be executed after any of the component's own converters and validators. If any of them fails, then this validator will not be exeucted. It is not recommended to put this validator somewhere in between the referenced components as the resulting behaviour may be confusing, for example because only the values of preceding components are converted and the values of following components are not converted. Put this validator either before or after all of the components, depending on how you would like to prioritize the validation.

     <o:validateMultipleFields id="myId" components="foo bar baz" />
     <h:message for="myId" />
     <h:inputText id="foo" />
     <h:inputText id="bar" />
     <h:inputText id="baz" />
     

    When a target component is disabled="true", readonly="true" or rendered="false", then the values argument of MultiFieldValidator.validateValues(FacesContext, List, List), will instead contain the initial model value. This is quite useful when you need to validate against an existing model.

    By default, in an invalidating case, all of the referenced components will be marked invalid and a faces message will be added on the client ID of this validator component. The default message can be changed by the message attribute. Any "{0}" placeholder in the message will be substituted with a comma separated string of labels of the referenced input components.

     <o:validateMultipleFields components="foo bar baz" message="{0} are wrong!" />
     

    You can also change the default message in the message bundle file as identified by <application><message-bundle> in faces-config.xml. The message key is just the component type as identified by COMPONENT_TYPE constant of the validator component. For example, ValidateAll has a ValidateAll.COMPONENT_TYPE value of org.omnifaces.component.validator.ValidateAll. Use exactly this value as message bundle key:

     org.omnifaces.component.validator.ValidateAll = {0} are wrong!
     

    You can use invalidateAll="false" to mark only those components which are actually invalid as invalid. In case of for example "input all" or "input all or none" validation, that would be only the fields which are left empty.

     <o:validateMultipleFields components="foo bar baz" message="{0} are wrong!" invalidateAll="false" />
     

    The faces message can also be shown for all of the referenced components using showMessageFor="@all".

     <o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@all" />
     <h:inputText id="foo" />
     <h:message for="foo" />
     <h:inputText id="bar" />
     <h:message for="bar" />
     <h:inputText id="baz" />
     <h:message for="baz" />
     

    The faces message can also be shown for only the invalidated components using showMessageFor="@invalid".

     <o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@invalid" />
     

    The faces message can also be shown as global message using showMessageFor="@global".

     <o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@global" />
     

    The faces message can also be shown for specific components referenced by a space separated collection of their client IDs in showMessageFor attribute.

     <o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="foo baz" />
     

    The showMessageFor attribute defaults to @this.

    The validator can be disabled by the disabled attribute. It accepts a request based EL expression.

     <o:validateMultipleFields components="foo bar baz" disabled="#{param.validationDisabled}" />
     

    There is a read-only validationFailed attribute which can be used to determine if the validation by this component has failed.

     <o:validateMultipleFields id="myId" binding="#{myId}" components="foo bar baz" />
     <h:panelGroup rendered="#{myId.validationFailed}">
         Validation has failed! <h:message for="myId" />
     </h:panelGroup>
     

    TODO: support for immediate="true".

    Author:
    Bauke Scholtz
    • Constructor Detail

      • ValidateMultipleFields

        protected ValidateMultipleFields()
        The default constructor sets the default message and sets the renderer type to null.
    • Method Detail

      • collectComponents

        protected List<UIInput> collectComponents()
        Collect the input components. Only those which are an instance of UIInput, are rendered, not disabled nor readonly will be returned. If at least one of them has already been validated and is been marked invalid, then an empty collection will be returned.
        Returns:
        The input components.
        Throws:
        IllegalArgumentException - When the components attribute is missing, or when it references an non-existing component, or when it references a non-input component.
      • collectValues

        protected List<Object> collectValues​(List<UIInput> inputs)
        Collect the values of the given input components.
        Parameters:
        inputs - The input components to collect values from.
        Returns:
        The values of the given input components.
      • shouldInvalidateInput

        protected boolean shouldInvalidateInput​(FacesContext context,
                                                UIInput input,
                                                Object value)
        Returns whether in in an invalidating case the given input component should be marked invalid. The default implementation returns true, meaning that all input components should be invalidated in an invalidating case. The overriding implementation may choose to return false for example when the value is empty, such as ValidateAllOrNone.
        Parameters:
        context - The faces context to work with.
        input - The input component which may need to be invalidated.
        value - The value of the input component.
        Returns:
        Whether in in an invalidating case the given input component should be marked invalid
        Since:
        1.7
      • showMessage

        protected void showMessage​(FacesContext context,
                                   List<UIInput> inputs)
        Show the message at the desired place(s) depending on the value of the showMessageFor attribute.
        • @this: message will be added to the <h:message> for this component.
        • @all: message will be added to all components as specified in components attribute.
        • Any other value in a space separated collection will be treated as client ID of UIInput component.
        Parameters:
        context - The faces context to work with.
        inputs - The validated input components.
      • getComponents

        public String getComponents()
        Returns the client identifiers of components which are to be validated.
        Returns:
        The client identifiers of components which are to be validated.
      • setComponents

        public void setComponents​(String components)
        Sets the client identifiers of components which are to be validated.
        Parameters:
        components - The client identifiers of components which are to be validated.
      • isInvalidateAll

        public boolean isInvalidateAll()
        Returns whether to invalidate all fields or only those which are actually invalid as per shouldInvalidateInput(FacesContext, UIInput, Object)
        Returns:
        Whether to invalidate all fields or only those which are actually invalid.
        Since:
        1.7
      • setInvalidateAll

        public void setInvalidateAll​(boolean invalidateAll)
        Sets whether to invalidate all fields or only those which are actually invalid as per shouldInvalidateInput(FacesContext, UIInput, Object)
        Parameters:
        invalidateAll - Whether to invalidate all fields or only those which are actually invalid.
        Since:
        1.7
      • getMessage

        public String getMessage()
        Returns the validation message to be shown.
        Returns:
        The validation message to be shown.
      • setMessage

        public void setMessage​(String message)
        Sets the validation message to be shown.
        Parameters:
        message - The validation message to be shown.
      • getShowMessageFor

        public String getShowMessageFor()
        Returns the client identifiers to show the validation message for.
        Returns:
        The client identifiers to show the validation message for.
      • setShowMessageFor

        public void setShowMessageFor​(String showMessageFor)
        Sets the client identifiers to show the validation message for.
        Parameters:
        showMessageFor - The client identifiers to show the validation message for.
      • isDisabled

        public boolean isDisabled()
        Returns whether the validation should be disabled or not.
        Returns:
        Whether the validation should be disabled or not.
      • setDisabled

        public void setDisabled​(boolean disabled)
        Sets whether the validation should be disabled or not.
        Parameters:
        disabled - Whether the validation should be disabled or not.
      • isValidationFailed

        public boolean isValidationFailed()
        Returns whether the validation has failed or not.
        Returns:
        Whether the validation has failed or not.
        Since:
        1.3