Выбрать главу

Краткая история валидации компонентов

Разработчики занимаются ограничением и валидацией создаваемых моделей с тех пор, как существует язык Java. Код и фреймворки сначала были кустарными, они породили определенные практики, которые стали применяться в первых свободных проектах. Так, еще в 2000 году валидация пользовательского ввода стала использоваться в Struts — знаменитом MVC-фреймворке для Сети. Но прошло еще некоторое время, прежде чем появились целые валидационные фреймворки, предназначенные исключительно для работы с Java (а не просто для обеспечения веб-взаимодействий). Наиболее известными из таких фреймворков являются, пожалуй, Commons Validator из Apache Commons и Hibernate Validator. Другие подобные фреймворки — iScreen, OVal, а также распространенный фреймворк Spring, в котором содержится собственный валидационный пакет.

Что нового появилось в версии Bean Validation 1.1

В настоящее время валидация компонентов в версии 1.1 интегрирована в Java EE 7. В этой младшей (корректировочной) версии появились многие новые возможности, были улучшены существующие. Рассмотрим основные новые возможности.

• В этой версии ограничения могут применяться к параметрам методов и возвращаемым значениям. Поэтому валидация компонентов может использоваться для описания и валидации контракта (предусловий и постусловий) заданного метода.

• Ограничения также могут применяться с конструкторами.

• Появился новый API для получения метаданных об ограничениях и объектах, подвергаемых этим ограничениям.

• Повысилась степень интеграции со спецификацией, описывающей контекст и внедрение зависимостей (теперь можно выполнять внедрение в валидаторы).

В табл. 3.1 перечислены основные пакеты, входящие в настоящее время в спецификацию Bean Validation 1.1.

Таблица 3.1. Основные пакеты для валидации компонентов
Пакет Описание
javax.validation Содержит основные API для валидации компонентов
javax.validation.bootstrap Классы, применяемые для начальной загрузки валидации компонентов и создания конфигурации, не зависящей от поставщика
javax.validation.constraints Содержит все встроенные ограничения
javax.validation.groups Стандартные группы для валидации компонентов
javax.validation.metadata Репозиторий метаданных для всех определенных ограничений и API запросов
javax.validation.spi API, определяющие контракт между механизмом начальной загрузки валидации и движком поставщика

Справочная реализация

Hibernate Validator — это свободная справочная реализация валидации компонентов. Проект изначально был запущен в 2005 году компанией JBoss в рамках Hibernate Annotations, стал независимым в 2007 году, а статус справочной реализации приобрел в 2009 году (с выходом Hibernate Validator 4). В настоящее время Hibernate Validator 5 реализует валидацию компонентов (версия 1.1) и добавляет кое-какие собственные возможности, в числе которых политика быстрого отказа. В соответствии с этим принципом программа прерывает текущую валидацию и возвращается после первого же нарушения ограничивающих условий. К другим характерным особенностям этой реализации относится API для программного конфигурирования ограничений, а также дополнительные встроенные ограничения.

На момент написания этой книги Hibernate Validator 5 был единственной реализацией, совместимой с Bean Validation 1.1. В Apache BVal применялась спецификация Bean Validation 1.0, в настоящее время идет процесс сертификации на соответствие версии 1.1. Oval не реализует полную спецификацию Bean Validation, но умеет обрабатывать связанные с ней ограничения.

Написание ограничений

До сих пор мы говорили об ограничениях, применяемых к нескольким уровням вашего приложения. Такие ограничения могут быть написаны одновременно на нескольких языках, с применением разных технологий. Но я также упоминал и о дублировании валидационного кода. Итак, насколько сложно будет применить ограничение в ваших классах Java, использующих валидацию компонентов? В листинге 3.1 показано, насколько просто добавлять ограничения в бизнес-модель.