Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование ограничений при валидации бинов

Модель Bean Validation поддерживается ограничениями в форме аннотаций, размещённых в поле, методе или классе компонента JavaBeans, такого как Managed-бин.

Ограничения бывают стандартными или могут быть заданы пользователем. Ограничения, заданные пользователем, называются пользовательскими ограничениями. Несколько предустановленных ограничений доступны в пакете javax.validation.constraints. Таблица 23-1 перечисляет все предустановленные ограничения. Смотрите Создание пользовательских ограничений для получения информации о создании пользовательских ограничений.

Таблица 23-1. Предустановленные ограничения валидации бинов

Ограничение

Описание

Пример

@AssertFalse

Значение поля или свойства должно быть false.

@AssertFalse
boolean isUnsupported;

@AssertTrue

Значение поля или свойства должно быть true.

@AssertTrue
boolean isActive;

@DecimalMax

Значение поля или свойства должно быть десятичным числом, меньшим или равным числу в элементе value.

@DecimalMax("30.00")
BigDecimal discount;

@DecimalMin

Значением поля или свойства должно быть десятичным числом, большим или равным числу в элементе value.

@DecimalMin("5.00")
BigDecimal discount;

@Digits

Значение поля или свойства должно быть числом в указанном диапазоне. Элемент integer определяет максимальное количество разрядов целой части числа, а элемент fraction — дробной части.

@Digits(integer=6, fraction=2)
BigDecimal price;

@Email

Значение поля или свойства должно быть валидным адресом электронной почты.

@Email
String emailaddress;

@Future

Значение поля или свойства должно быть датой в будущем.

@Future
Date eventDate;

@FutureOrPresent

Значение поля или свойства должно быть датой или временем в настоящем или будущем.

@FutureOrPresent
Time travelTime;

@Max

Значение поля или свойства должно быть целым числом, меньшим или равным числу в элементе value.

@Max(10)
int quantity;

@Min

Значение поля или свойства должно быть целым числом, большим или равным числу в элементе value.

@Min(5)
int quantity;

@Negative

Значение поля или свойства должно быть отрицательным числом.

@Negative
int basementFloor;

@NegativeOrZero

Значение поля или свойства должно быть отрицательным числом или нулём.

@NegativeOrZero
int debtValue;

@NotBlank

Значение поля или свойства должно содержать как минимум один символ, не являющийся пробелом.

@NotBlank
String message;

@NotEmpty

Значение поля или свойства не должно быть пустым. Вычисляется длина символов или массива, а также размер коллекции или отображения (Map).

@NotEmpty
String message;

@NotNull

Значение поля или свойства не должно быть null.

@NotNull
String username;

@Null

Значение поля или свойства должно быть null.

@Null
String unusedString;

@Past

Значение поля или свойства должно быть датой в прошлом.

@Past
Date birthday;

@PastOrPresent

Значением поля или свойства должна быть дата или время в прошлом или настоящем.

@PastOrPresent
Date travelDate;

@Pattern

Значение поля или свойства должно соответствовать регулярному выражению, заданному в элементе regexp.

@Pattern(regexp="\\(\\d{3}\\)\\d{3}-\\d{4}")
String phoneNumber;

@Positive

Значение поля или свойства должно быть положительным числом.

@Positive
BigDecimal area;

@PositiveOrZero

Значение поля или свойства должно быть положительным числом или нулём. .

@PositiveOrZero
int totalGoals;

@Size

Размер поля или свойства вычисляется и должен соответствовать указанным границам. Если поле или свойство представляет собой String, вычисляется размер строки. Если поле или свойство представляет собой Collection, вычисляется размер Collection. Если поле или свойство является Map, вычисляется размер Map. Если поле или свойство является массивом, вычисляется размер массива. Используйте один из необязательных элементов max или min, чтобы указать границы.

@Size(min=2, max=240)
String briefMessage;

В следующем примере на поле накладывается ограничение с использованием предустановленного ограничения @NotNull:

public class Name {
    @NotNull
    private String firstname;

    @NotNull
    private String lastname;
    ...
}

Вы также можете разместить более одного ограничения на один объект компонента JavaBeans. Например, вы можете поместить дополнительное ограничение на размеры полей firstname и lastname:

public class Name {
    @NotNull
    @Size(min=1, max=16)
    private String firstname;

    @NotNull
    @Size(min=1, max=16)
    private String lastname;
    ...
}

В следующем примере показан метод с пользовательским ограничением, которое проверяет предварительно заданный шаблон телефонного номера, например номер телефона конкретной страны:

@USPhoneNumber
public String getPhone() {
    return phone;
}

Для предустановленного ограничения доступна реализация по умолчанию. Определяемое пользователем ограничение требует реализации. В предыдущем примере пользовательскому ограничению @USPhoneNumber требуется класс реализации.

Повторяющиеся аннотации

В Bean Validation 2.0 можно указать одно и то же ограничение несколько раз для цели валидации, используя повторяющуюся аннотацию:

public class Account {

    @Max (value = 2000, groups = Default.class, message = "max.value")
    @Max (value = 5000, groups = GoldCustomer.class, message = "max.value")
    private long withdrawalAmount;
}

Все предустановленные ограничения из пакета javax.validation.constraints поддерживают повторяющиеся аннотации. Аналогичным образом, пользовательские ограничения могут использовать аннотацию @Repeatable. В следующем примере, в зависимости от группы PeakHour или NonPeakHour, проверяется, является ли объект автомобиля трёх- или четырёхместным автомобилем и затем указывается подходящая полоса для движения:

/**
 * Validate whether a car is eligible for car pool lane
 */
@Documented
@Constraint(validatedBy = CarPoolValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
public @interface CarPool {

    String message() default "{CarPool.message}";

    Class[] groups() default {};

    int value();

    Class<€? extends Payload>[] payload() default {};

    /**
     * Defines several @CarPool annotations on the same element
     * @see (@link CarPool}
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        CarPool[] value();
    }
}
public class Car{

  private String registrationNumber;

  @CarPool(value = 2, group = NonPeakHour.class)
  @CarPool(value = 3, group = {Default.class, PeakHour.class})
  private int totalPassengers;
}

Любые ошибки валидации корректно обрабатываются и могут отображаться тегом h:messages.

Любой Managed-бин, содержащий аннотации Bean Validation, автоматически приобретает ограничения, объявленные для полей на веб-страницах JavaServer Faces.

Для получения дополнительной информации об использовании ограничений проверки см. следующее:


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)