Изучаем Java EE 7 - [45]

Шрифт
Интервал


Валидатор

Основной входной точкой для валидации является интерфейс Validator. Этот API позволяет проверять экземпляры компонентов, обходясь немногочисленными методами, перечисленными в табл. 3.4. Все эти методы объявляют каждое новое ограничение по одному и тому же образцу.

1. Устанавливается подходящая реализация ConstraintValidator, которая будет использоваться при определении данного ограничения (например, определяется ConstraintValidator для ограничения @Size, применяемого со строкой).

2. Выполняется метод isValid.

3. Если isValid возвращает true, программа переходит к следующему ограничению.

4. Если isValid возвращает false, поставщик валидации компонентов добавляет ConstraintViolation в список нарушений ограничений.


Таблица 3.4. Методы интерфейса Validator
МетодОписание
Set>validate(T object, Class… groups)Валидирует все ограничения, применяемые с объектом
Set>validateProperty(T object, String propName, Class… groups)Валидирует все ограничения, касающиеся свойства
Set>validateValue(Class beanType, String propName, Object value,Class… groups)Валидирует все ограничения, применяемые к свойству при заданном значении
BeanDescriptor getConstraintsForClass(Class clazz)Возвращает объект дескриптора, описывающий ограничения компонента
ExecutableValidator forExecutables()Возвращает делегат для валидации параметров и возвращаемых значений у методов и конструкторов

Если в ходе этой процедуры валидации происходит какая-либо неисправимая ошибка, то выдается исключение ValidationException. Это исключение может быть специализированным и может указывать на конкретные ситуации (недопустимое определение группы, недопустимое определение ограничения, недопустимое объявление ограничения).

Методы validate, validateProperty и validateValue используются соответственно для валидации целого компонента, свойства или свойства при заданном значении. Все методы принимают параметр varargs, позволяющий указывать группы для валидации. Метод forExecutables предоставляет доступ к ExecutableValidator для валидации методов, параметров конструктора и валидации возвращаемого значения. В табл. 3.5 описан API ExecutableValidator.


Таблица 3.5. Методы для интерфейса ExecutableValidator
МетодОписание
Set>validateParameters(T object, MethodВалидирует все ограничения, применяемые с параметрами метода
method, Object[] params, Class… groups)
Set>validateReturnValue(T object, Method method, Object returnValue, Class… groups)Валидирует все ограничения возвращаемого значения, применяемые с методом
Set>validateConstructorParameters (Constructor constructor, Object[] params, Class… groups)Валидирует все ограничения, связанные с параметрами конструктора
Set>validateConstructorReturnValue (Constructor constructor, T createdObject, Class… groups)Валидирует все ограничения возвращаемых значений, связанные с конструктором

ConstraintViolation

Все валидационные методы, перечисленные в табл. 3.4 и 3.5, возвращают множество ConstraintViolation, которое можно перебирать и при этом просматривать, какие ошибки возникли при валидации. Если это множество пустое — значит, валидация прошла успешно. При ошибках в это множество добавляется по экземпляру ConstraintViolation для каждого нарушенного ограничения. ConstraintViolation описывает единую ошибку, связанную с ограничением, а его API дает множество полезной информации о причине ошибки. В табл. 3.6 сделан обзор этого API.


Таблица 3.6. Методы интерфейса ConstraintViolation
МетодОписание
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();


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.