3.5.2.4.4. Validator
Валидатор предназначен для проверки значения, введенного в визуальном компоненте.
|
Следует отличать валидацию от проверки типа данных. Если для некоторого компонента, например TextField, задан тип, отличный от строкового (это происходит при связывании с атрибутом сущности или назначении Валидация же срабатывает не сразу при вводе или потере компонентом фокуса, а только при вызове у компонента метода |
Фреймворк уже содержит несколько реализаций наиболее часто используемых валидаторов, которые можно применять в проектах:
В XML-дескрипторе экрана такие валидаторы для компонента задаются во вложенном элементе validators.
Валидатор можно установить с помощью интерфейса CUBA Studio. Пример добавления валидатора к компоненту TextField:
Каждый валидатор является Prototype бином, и если вы хотите использовать валидаторы из Java-кода, вы можете загрузить их с помощью BeanLocator.
Некоторые валидаторы используют Groovy в сообщении об ошибке. Это означает, что в сообщение об ошибке можно передать параметры (например, $value). Эти параметры учитывают языковую локаль пользователя.
В качестве валидатора можно использовать кастомный Java-класс, реализующий интерфейс Consumer.
В XML-дескрипторе экрана кастомный валидатор для компонента задается во вложенном элементе validator.
|
Если валидатор реализован внутренним классом, то он должен быть объявлен с модификатором
|
Валидатор-класс можно назначить компоненту не только в XML-дескрипторе экрана, но и программно, передавая экземпляр валидатора в метод addValidator() компонента.
Пример создания класса валидатора почтового индекса:
public class ZipValidator implements Consumer<String> {
@Override
public void accept(String s) throws ValidationException {
if (s != null && s.length() != 6)
throw new ValidationException("Zip must be of 6 characters length");
}
}
Использование валидатора почтового индекса для текстового поля TextField:
<textField id="zipField" property="zip">
<validator class="com.company.sample.web.ZipValidator"/>
</textField>
Пример программного задания валидатора:
zipField.addValidator(value -> {
if (value != null && value.length() != 6)
throw new ValidationException("Zip must be of 6 characters length");
});
Ниже мы рассмотрим предопределенные валидаторы.
- DecimalMaxValidator
-
Проверяет, что значение меньше или равно указанному максимальному значению. Поддерживаемые типы:
BigDecimal,BigInteger,Long,IntegerиString, представляющий значениеBigDecimalс текущей локалью.Валидатор имеет следующие атрибуты:
-
value− максимальное значение (обязательный атрибут); -
inclusive− если атрибут установлен вtrue, вводимое значение должно быть меньше или равно указанному максимальному значению. Значение по умолчанию −true; -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$maxдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.decimalMaxInclusive -
validation.constraints.decimalMax
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <decimalMax value="1000" inclusive="false" message="Value '$value' cannot be greater than `$max`"/> </validators> </textField>Использование в Java коде:
DecimalMaxValidator maxValidator = beanLocator.getPrototype(DecimalMaxValidator.NAME, new BigDecimal(1000)); numberField.addValidator(maxValidator); -
- DecimalMinValidator
-
Проверяет, что значение больше или равно указанному минимальному значению. Поддерживаемые типы:
BigDecimal,BigInteger,Long,IntegerиString, представляющий значениеBigDecimalс текущей локалью.Валидатор имеет следующие атрибуты:
-
value− минимальное значение (обязательный атрибут); -
inclusive− если атрибут установлен вtrue, вводимое значение должно быть больше или равно указанному минимальному значению. Значение по умолчанию −true; -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$minдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.decimalMinInclusive -
validation.constraints.decimalMin
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <decimalMin value="100" inclusive="false" message="Value '$value' cannot be less than `$min`"/> </validators> </textField>Использование в Java коде:
DecimalMinValidator minValidator = beanLocator.getPrototype(DecimalMinValidator.NAME, new BigDecimal(100)); numberField.addValidator(minValidator); -
- DigitsValidator
-
Проверяет, что значение − это число в пределах обозначенного диапазона. Поддерживаемые типы:
BigDecimal,BigInteger,Long,IntegerиString, представляющий значениеBigDecimalс текущей локалью.Валидатор имеет следующие атрибуты:
-
integer− количество цифр в целочисленной части (обязательный атрибут); -
fraction− количество цифр в дробной части (обязательный атрибут); -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$value,$integerи$fractionдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.digits
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <digits integer="3" fraction="2" message="Value '$value' is out of bounds ($integer digits are expected in integer part and $fraction in fractional part)"/> </validators> </textField>Использование в Java коде:
DigitsValidator digitsValidator = beanLocator.getPrototype(DigitsValidator.NAME, 3, 2); numberField.addValidator(digitsValidator); -
- DoubleMaxValidator
-
Проверяет, что значение меньше или равно указанному максимальному значению. Поддерживаемые типы:
DoubleиString, представляющий значениеDoubleс текущей локалью.Валидатор имеет следующие атрибуты:
-
value− максимальное значение (обязательный атрибут); -
inclusive− если атрибут установлен вtrue, вводимое значение должно быть меньше или равно указанному максимальному значению. Значение по умолчанию −true; -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$maxдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.decimalMaxInclusive -
validation.constraints.decimalMax
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <doubleMax value="1000" inclusive="false" message="Value '$value' cannot be greater than `$max`"/> </validators> </textField>Использование в Java коде:
DoubleMaxValidator maxValidator = beanLocator.getPrototype(DoubleMaxValidator.NAME, new Double(1000)); numberField.addValidator(maxValidator); -
- DoubleMinValidator
-
Проверяет, что значение больше или равно указанному минимальному значению. Поддерживаемые типы:
DoubleиString, представляющий значениеDoubleс текущей локалью.Валидатор имеет следующие атрибуты:
-
value− минимальное значение (обязательный атрибут); -
inclusive− если атрибут установлен вtrue, вводимое значение должно быть больше или равно указанному минимальному значению. Значение по умолчанию −true; -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$minдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.decimalMinInclusive -
validation.constraints.decimalMin
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <doubleMin value="100" inclusive="false" message="Value '$value' cannot be less than `$min`"/> </validators> </textField>Использование в Java коде:
DoubleMinValidator minValidator = beanLocator.getPrototype(DoubleMinValidator.NAME, new Double(100)); numberField.addValidator(minValidator); -
- FutureOrPresentValidator
-
Проверяет, что дата или время находится в будущем или настоящем. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке. Поддерживаемые типы:
java.util.Date,LocalDate,LocalDateTime,LocalTime,OffsetDateTime,OffsetTime.Валидатор имеет следующие атрибуты:
-
checkSeconds− если установлено значениеtrue, валидатор сравнивает дату или время с секундами и наносекундами. Значение по умолчанию −false; -
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.futureOrPresent
Использование в XML-дескрипторе:
<dateField id="dateTimePropertyField" property="dateTimeProperty"> <validators> <futureOrPresent checkSeconds="true"/> </validators> </dateField>Использование в Java коде:
FutureOrPresentValidator futureOrPresentValidator = beanLocator.getPrototype(FutureOrPresentValidator.NAME); dateField.addValidator(futureOrPresentValidator); -
- FutureValidator
-
Проверяет, что дата или время находится в будущем. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке. Поддерживаемые типы:
java.util.Date,LocalDate,LocalDateTime,LocalTime,OffsetDateTime,OffsetTime.Валидатор имеет следующие атрибуты:
-
checkSeconds− если установлено значениеtrue, валидатор сравнивает дату или время с секундами и наносекундами. Значение по умолчанию −false; -
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.future
Использование в XML-дескрипторе:
<timeField id="localTimeField" property="localTimeProperty" showSeconds="true"> <validators> <future checkSeconds="true"/> </validators> </timeField>Использование в Java коде:
FutureValidator futureValidator = beanLocator.getPrototype(FutureValidator.NAME); timeField.addValidator(futureValidator); -
- MaxValidator
-
Проверяет, что значение меньше или равно указанному максимальному значению. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer.Валидатор имеет следующие атрибуты:
-
value− максимальное значение (обязательный атрибут); -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$maxдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.max
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <max value="20500" message="Value '$value' must be less than or equal to '$max'"/> </validators> </textField>Использование в Java коде:
MaxValidator maxValidator = beanLocator.getPrototype(MaxValidator.NAME, 20500); numberField.addValidator(maxValidator); -
- MinValidator
-
Проверяет, что значение больше или равно указанному минимальному значению. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer.Валидатор имеет следующие атрибуты:
-
value− минимальное значение (обязательный атрибут); -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$valueи$minдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.min
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <min value="30" message="Value '$value' must be greater than or equal to '$min'"/> </validators> </textField>Использование в Java коде:
MinValidator minValidator = beanLocator.getPrototype(MinValidator.NAME, 30); numberField.addValidator(minValidator); -
- NegativeOrZeroValidator
-
Проверяет, что значение меньше или равно 0. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer,Double,Float.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$valueдля форматированного вывода. Обратите внимание, чтоFloatне имеет своего собственного типа данных и не будет отформатирован с пользовательской локалью.
Ключи сообщения по умолчанию:
-
validation.constraints.negativeOrZero
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <negativeOrZero message="Value '$value' must be less than or equal to 0"/> </validators> </textField>Использование в Java коде:
NegativeOrZeroValidator negativeOrZeroValidator = beanLocator.getPrototype(NegativeOrZeroValidator.NAME); numberField.addValidator(negativeOrZeroValidator); -
- NegativeValidator
-
Проверяет, что значение строго меньше 0. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer,Double,Float.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$valueдля форматированного вывода. Обратите внимание, чтоFloatне имеет своего собственного типа данных и не будет отформатирован с пользовательской локалью.
Ключи сообщения по умолчанию:
-
validation.constraints.negative
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <negative message="Value '$value' should be less than 0"/> </validators> </textField>Использование в Java коде:
NegativeValidator negativeValidator = beanLocator.getPrototype(NegativeValidator.NAME); numberField.addValidator(negativeValidator); -
- NotBlankValidator
-
Проверяет, что значение содержит по крайней мере один символ без пробела. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке. Поддерживаемый тип:
String.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.notBlank
Использование в XML-дескрипторе:
<textField id="textField" property="textProperty"> <validators> <notBlank message="Value must contain at least one non-whitespace character"/> </validators> </textField>Использование в Java коде:
NotBlankValidator notBlankValidator = beanLocator.getPrototype(NotBlankValidator.NAME); textField.addValidator(notBlankValidator); -
- NotEmptyValidator
-
Проверяет, что значение не пустое и не
null. Поддерживаемые типы:CollectionиString.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$value(только типаString) для форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.notEmpty
Использование в XML-дескрипторе:
<textField id="textField" property="textProperty"> <validators> <notEmpty/> </validators> </textField>Использование в Java коде:
NotEmptyValidator notEmptyValidator = beanLocator.getPrototype(NotEmptyValidator.NAME); textField.addValidator(notEmptyValidator); -
- NotNullValidator
-
Проверяет, что значение не
null. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.notNull
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <notNull/> </validators> </textField>Использование в Java коде:
NotNullValidator notNullValidator = beanLocator.getPrototype(NotNullValidator.NAME); numberField.addValidator(notNullValidator); -
- PastOrPresentValidator
-
Проверяет, что дата или время находится в прошлом или настоящем. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке. Поддерживаемые типы:
java.util.Date,LocalDate,LocalDateTime,LocalTime,OffsetDateTime,OffsetTime.Валидатор имеет следующие атрибуты:
-
checkSeconds− если установлено значениеtrue, валидатор сравнивает дату или время с секундами и наносекундами. Значение по умолчанию −false; -
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.pastOrPresent
Использование в XML-дескрипторе:
<dateField id="dateTimeField" property="dateTimeProperty"> <validators> <pastOrPresent/> </validators> </dateField>Использование в Java коде:
PastOrPresentValidator pastOrPresentValidator = beanLocator.getPrototype(PastOrPresentValidator.NAME); numberField.addValidator(pastOrPresentValidator); -
- PastValidator
-
Проверяет, что дата или время находится в прошлом. Валидатор не использует Groovy, поэтому нет параметров, которые вы можете передать в сообщение об ошибке. Поддерживаемые типы:
java.util.Date,LocalDate,LocalDateTime,LocalTime,OffsetDateTime,OffsetTime.Валидатор имеет следующие атрибуты:
-
checkSeconds− если установлено значениеtrue, валидатор сравнивает дату или время с секундами и наносекундами. Значение по умолчанию −false; -
message− сообщение, выводимое пользователю в случае ошибки валидации.
Ключи сообщения по умолчанию:
-
validation.constraints.past
Использование в XML-дескрипторе:
<dateField id="dateTimeField" property="dateTimeProperty"> <validators> <pastOrPresent/> </validators> </dateField>Использование в Java коде:
PastOrPresentValidator pastOrPresentValidator = beanLocator.getPrototype(PastOrPresentValidator.NAME); numberField.addValidator(pastOrPresentValidator); -
- PositiveOrZeroValidator
-
Проверяет, что значение больше или равно 0. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer,Double,Float.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$valueдля форматированного вывода. Обратите внимание, чтоFloatне имеет своего собственного типа данных и не будет отформатирован с пользовательской локалью.
Ключи сообщения по умолчанию:
-
validation.constraints.positiveOrZero
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <positiveOrZero message="Value '$value' should be greater than or equal to '0'"/> </validators> </textField>Использование в Java коде:
PositiveOrZeroValidator positiveOrZeroValidator = beanLocator.getPrototype(PositiveOrZeroValidator.NAME); numberField.addValidator(positiveOrZeroValidator); -
- PositiveValidator
-
Проверяет, что значение строго больше 0. Поддерживаемые типы:
BigDecimal,BigInteger,Long,Integer,Double,Float.Валидатор имеет следующие атрибуты:
-
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$valueдля форматированного вывода. Обратите внимание, чтоFloatне имеет своего собственного типа данных и не будет отформатирован с пользовательской локалью.
Ключи сообщения по умолчанию:
-
validation.constraints.positive
Использование в XML-дескрипторе:
<textField id="numberField" property="numberProperty"> <validators> <positive message="Value '$value' should be greater than '0'"/> </validators> </textField>Использование в Java коде:
PositiveValidator positiveValidator = beanLocator.getPrototype(PositiveValidator.NAME); numberField.addValidator(positiveValidator); -
- RegexpValidator
-
Проверяет, что строковое значение соответствует указанному регулярному выражению. Поддерживаемый тип:
String.Валидатор имеет следующие атрибуты:
-
regexp− регулярное выражение для проверки соответствия (обязательный атрибут); -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменную$valueдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.regexp
Использование в XML-дескрипторе:
<textField id="textField" property="textProperty"> <validators> <regexp regexp="[a-z]*"/> </validators> </textField>Использование в Java коде:
RegexpValidator regexpValidator = beanLocator.getPrototype(RegexpValidator.NAME, "[a-z]*"); textField.addValidator(regexpValidator); -
- SizeValidator
-
Проверяет, что значение находится в определенном диапазоне. Поддерживаемые типы:
CollectionandString.Валидатор имеет следующие атрибуты:
-
min− минимальное значение (включительно), не может быть меньше 0. Значение по умолчанию − 0; -
max− максимальное значение (включительно), не может быть меньше 0. Значение по умолчанию −Integer.MAX_VALUE; -
message− сообщение, выводимое пользователю в случае ошибки валидации. Это сообщение может содержать переменные$value(только для типаString),$min,$maxдля форматированного вывода.
Ключи сообщения по умолчанию:
-
validation.constraints.collectionSizeRange -
validation.constraints.sizeRange
Использование в XML-дескрипторе:
<textField id="textField" property="textProperty"> <validators> <size min="2" max="10" message="Value '$value' should be between '$min' and '$max'"/> </validators> </textField> <twinColumn id="twinColumn"> <validators> <size min="2" max="4" message="Collection size must be between $min and $max"/> </validators> </twinColumn>Использование в Java коде:
SizeValidator sizeValidator = beanLocator.getPrototype(SizeValidator.NAME); textField.addValidator(sizeValidator); -