МетодОписание
String getMessage()Возвращает интерполированное сообщение об ошибке для данного нарушения
String getMessageTemplate()Возвращает неинтерполированное сообщение об ошибке
T getRootBean()Возвращает корневой компонент, участвующий в валидации
Class getRootBeanClass()Возвращает класс корневого компонента, участвующего в валидации
Object getLeafBean()Возвращает дочерний компонент, к которому применяется ограничение
Path getPropertyPath()Возвращает путь свойств к значению от корневого компонента
Object getInvalidValue()Возвращает значение, которое не соответствует заданному ограничению
ConstraintDescriptor getConstraintDescriptor()Возвращает метаданные об ограничении
Получение валидатора

Первый этап валидации компонента — приобрести экземпляр интерфейса Validator. Как и в большинстве спецификаций Java EE, вы можете либо получить Validator программно (если ваш код выполняется вне контейнера), либо внедрить его (если код выполняется в EJB- или веб-контейнере).

Если вы делаете это программно, то необходимо начать с класса Validation, осуществляющего начальную загрузку поставщика валидации компонентов. Его метод buildDefaultValidatorFactory строит и возвращает фабрику ValidatorFactory, которая, в свою очередь, используется для построения Validator. Код выглядит следующим образом:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

Validator validator = factory.getValidator();

Затем вам придется управлять жизненным циклом ValidatorFactory и программно закрывать его:

factory.close();

Если ваше приложение работает в контейнере Java EE, то контейнер должен предоставлять через JNDI следующие экземпляры:

• ValidatorFactory под java: comp/ValidatorFactory;

• Validator под java: comp/Validator.

Затем вы можете искать эти JNDI-имена и получать экземпляры Validator. Но вместо поиска экземпляров через JNDI вы можете запросить, чтобы они были внедрены с помощью аннотации @Resource:

@Resource ValidatorFactory validatorFactory;

@Resource Validator validator;

Если ваш контейнер использует CDI (а это происходит в Java EE 7 по умолчанию), то он должен допускать внедрение с помощью @Inject:

@Inject ValidatorFactory;

@Inject Validator;

В любом случае (как с @Resource, так и с @Inject) контейнер следит за жизненным циклом фабрики. Поэтому вам не придется вручную создавать или закрывать ValidatorFactory.

<p>Валидация компонентов</p>

Как только вы получите Validator программно или путем внедрения, можете использовать его методы как для валидации целого компонента, так и для работы с отдельно взятым свойством. В листинге 3.21 показан класс CD, в котором действуют ограничения, связанные со свойствами, параметрами методов и возвращаемым значением.

Листинг 3.21. Компонент с ограничениями, применяемыми со свойствами и методами

public class CD {

··@NotNull @Size(min = 4, max = 50)

··private String title;

··@NotNull

··private Float price;

··@NotNull(groups = PrintingCatalog.class)

··@Size(min = 100, max = 5000, groups = PrintingCatalog.class)

··private String description;

··@Pattern(regexp = "[A-Z][a-z]{1,}")

··private String musicCompany;

··@Max(value = 5)

··private Integer numberOfCDs;

··private Float totalDuration;

··@NotNull @DecimalMin("5.8")

··public Float calculatePrice(@DecimalMin("1.4") Float rate) {

····return price * rate;

··}

··@DecimalMin("9.99")

··public Float calculateVAT() {

····return price * 0.196f;

··}

}

Перейти на страницу:

Похожие книги