5.5.2.3.4. Validator
Валидатор предназначен для проверки значения, введенного в визуальном компоненте.
|
Warning
|
Следует отличать валидацию от проверки типа данных. Если для некоторого компонента, например TextField, задан тип, отличный от строкового (это происходит при связывании с атрибутом сущности или назначении Валидация же срабатывает не сразу при вводе или потере компонентом фокуса, а только при вызове у компонента метода |
В XML-дескрипторе экрана валидатор для компонента может быть задан во вложенном элементе validator. Возможные атрибуты элемента validator:
-
script− путь к скрипту Groovy, осуществляющему валидацию. -
class− имя класса Java, реализующего интерфейсField.Validator.
Groovy-валидатор и стандартные классы Java-валидаторов, расположенные в пакете com.haulmont.cuba.gui.components.validators поддерживают атрибут message − сообщение, выводимое пользователю в случае ошибки валидации. Атрибут должен содержать сообщение или ключ в пакете сообщений экрана, например:
<validator class="com.haulmont.cuba.gui.components.validators.PatternValidator"
message="msg://validationError"
pattern="\d{3}"/>
# messages.properties
validationError = Input error
Валидатор можно установить с помощью интерфейса CUBA Studio. Пример добавления валидатора к полю fieldGroup:
Выбор механизма валидации осуществляется следующим образом:
-
Если не указано значение атрибута
script, и сам элементvalidatorне содержит текста выражения Groovy, то в качестве валидатора используется класс, указанный в атрибутеclass.<field property="amount"> <validator class="com.haulmont.cuba.gui.components.validators.DoubleValidator"/> </field> -
Если элемент
validatorсодержит текст, то он будет использован как выражение Groovy и выполнен с помощью Scripting.<field property="year"> <validator> value ==~ /\d+/ </validator> </field> -
В противном случае с помощью Scripting будет выполнен скрипт Groovy, указанный в атрибуте
script.<field property="zipCode"> <validator script="com.company.demo.web.address.ZipValidator"/> </field>
В выражение или скрипт Groovy будет передана одна переменная value, содержащая значение, введенное в визуальном компоненте. Выражение или скрипт должны вернуть boolean значение: true − valid, false − not valid.
Если в качестве валидатора используется класс Java, то он должен иметь либо дефолтный конструктор без параметров, либо конструктор со следующим набором параметров:
-
org.dom4j.Element,String- в этот конструктор будут переданы XML-элемент валидатора и имя пакета сообщений экрана. -
org.dom4j.Element- в этот конструктор будет передан XML-элемент валидатора.
|
Tip
|
Если валидатор реализован внутренним классом, то он должен быть объявлен с модификатором
|
Платформа уже содержит несколько реализаций наиболее часто используемых валидаторов (см. пакет com.haulmont.cuba.gui.components.validators), которые можно применять в проектах:
-
DateValidator -
DoubleValidator -
EmailValidator -
IntegerValidator -
LongValidator -
PatternValidator -
ScriptValidator -
StringValidator
Валидатор-класс можно назначить компоненту не только в XML-дескрипторе экрана, но и программно, передавая экземпляр валидатора в метод addValidator() компонента.
Пример создания класса валидатора почтового индекса:
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");
}
}
Использование валидатора почтового индекса и стандартного валидатора по шаблону в полях компонента FieldGroup:
<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>
Пример программного задания валидатора:
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"));
}
}
});
}