3.5.2.4.5. Validator
Validator is designed to check values entered into visual components.
Validation and input type checking should be differentiated. If a given component (e.g. TextField) data type is set to anything different than string (this can happen when binding to an entity attribute or setting On the other hand, validation does not act immediately on data entry or focus loss, but rather when the component’s |
In a screen XML-descriptor, a component validator can be defined in a nested validator
elements. The validator
element can have the following attributes:
-
script
− path to a Groovy script performing validation. -
class
− name of a Java class implementing theField.Validator
interface.
Groovy validator scripts and standard classes of Java validators, located in the com.haulmont.cuba.gui.components.validators
package support message
attribute − a message displayed to a user when validation fails. The attribute value should contain either a message or a message key from the messages pack of the current screen. For example:
<validator class="com.haulmont.cuba.gui.components.validators.PatternValidator"
message="msg://validationError"
pattern="\d{3}"/>
# messages.properties
validationError = Input error
Validator can be added using CUBA Studio interface. Below is an example of adding a validator to the fieldGroup
field:
The validation mechanism is selected as follows:
-
If the value of the
script
attribute is not set and thevalidator
element itself does not contain text with a Groovy expression, then the system will use a class defined in theclass
attribute as a validator.<field property="amount"> <validator class="com.haulmont.cuba.gui.components.validators.DoubleValidator"/> </field>
-
If the
validator
element contains text, it will be used as a Groovy expression and executed using Scripting.<field property="year"> <validator> value ==~ /\d+/ </validator> </field>
-
Otherwise, the system will use Scripting to run a Groovy script defined in the
script
attribute.<field property="zipCode"> <validator script="com.company.demo.web.address.ZipValidator"/> </field>
The value
variable will be passed to a Groovy expression or script. It contains the value entered into a visual component. The expression or the script should return a boolean
value: true
− valid, false
− not valid.
If a Java class is being used as a validator, it should have a default constructor without parameters or a constructor with the following set of parameters:
-
org.dom4j.Element
,String
– this constructor will receive the validator XML-element and the message pack name of the screen. -
org.dom4j.Element
– this constructor will receive the validator XML-element.
If the validator is implemented as an internal class, it should be declared with a
|
The platform contains the set of implementations for the most frequently used validators (see com.haulmont.cuba.gui.components.validators
package), which can be used in your project:
-
DateValidator
-
DoubleValidator
-
EmailValidator
-
IntegerValidator
-
LongValidator
-
PatternValidator
-
ScriptValidator
-
StringValidator
A validator class can be assigned to a component not only using a screen XML-descriptor, but also programmatically – by submitting a validator instance into the component’s addValidator()
method.
Example of creating a validator class for zip codes:
public class ZipValidator implements Field.Validator {
@Override
public void validate(Object value) throws ValidationException {
if (value != null && ((String) value).length() != 6)
throw new ValidationException("Zip must be of 6 characters length");
}
}
Example of using a zip code validator and a standard pattern validator for fields of a FieldGroup component:
<fieldGroup>
<field property="zip" required="true">
<validator class="com.company.sample.gui.ZipValidator"/>
</field>
<field property="imei">
<validator class="com.haulmont.cuba.gui.components.validators.PatternValidator"
pattern="\d{15}"
message="IMEI validation failed"/>
</field>
</fieldGroup>
Example of setting a validator programmatically in a screen controller:
if (Boolean.TRUE.equals(parameter.getRequired())) {
tokenList.addValidator(new Field.Validator() {
@Override
public void validate(Object value) throws ValidationException {
if (value instanceof Collection && CollectionUtils.isEmpty((Collection) value)) {
throw new ValidationException(getMessage("paramIsRequiredButEmpty"));
}
}
});
}