Компоненты Bean Validation могут быть сконфигурированы при помощи XML-файлов. Такой подход может быть удобен, когда требуется добавить валидацию классов, недоступных для изменения, либо в тех случаях, когда хочется избежать появления сторонних зависимостей в коде. Основной XML-файл конфигурации — META-INF/validation.xml, в нём находятся основные настройки Bean Validation.
Дескриптор валидации
Десриптор валидации — validation.xml, имеет корневой элемент validation-config из пространства имён http://xmlns.jcp.org/xml/ns/validation/configuration (для Bean Validation 2.0), содержащий следующие дочерние элементы:
- default-provider — полное имя класса, реализующего ValidationProvider, который будет использован в качестве провайдера валидации по умолчанию
- message-interpolator — полное имя класса, реализующего MessageInterpolator
- traversable-resolver — полное имя класса, реализующего TraversableResolver
- constraint-validatator-factory — полное имя класса, реализующего ConstraintValidatorFactory
- parameter-name-provider — полное имя класса, реализующего ParameterNameProvider
- clock-provider — полное имя класса, реализующего ClockProvider
- value-extractor — полное имя класса, реализующего ValueExtractor; один файл validation.xml может содержать несколько
- executable-validation — определяет использование валидации для методов. Если атрибут enabled имеет значение false, то валидация для методов не будет использоваться. Может содержать один дочерний элемент default-validated-executable-types, содержащий в свою очередь список элементов executable-type, допустимые значения которых:
- ALL — валидировать все методы
- CONSTRUCTORS — валидировать конструкторы
- GETTER_METHODS — валидировать get-методы
- NON_GETTER_METHODS — валидировать не get-методы
- NONE — не валидировать методы
- constraint-mapping — список файлов с настройками ограничений/правил валидации
- property — простая переменная, имя который задаётся свойством name
Все эти свойства опциональны, если их не указывать (или не создавать файл validation.xml), то компоненты Bean Validation будут сконфигурированы с настройками по умолчанию.
Пример простой конфигурации validation.xml:
1 2 3 4 5 |
<?xml version="1.0" encoding="UTF-8" ?> <validation-config xmlns="http://xmlns.jcp.org/xml/ns/validation/configuration" version="2.0"> <constraint-mapping>META-INF/validation/note-constraints.xml</constraint-mapping> <constraint-mapping>META-INF/validation/task-constraints.xml</constraint-mapping> </validation-config> |
Файл правил валидации
Проект может содержать несколько файлов с правилами валидации. Это можно использовать для разделения правил валидации в зависимости от классов, к которым они применяются. Файл правил валидации имеет корневой элемент constraint-mappings из пространства имён http://xmlns.jcp.org/xml/ns/validation/mapping (для Bean Validation 2.0), содержащий следующие дочерние элементы:
- default-package — пакет по умолчанию для данного файла. Поиск классов, указываемых в элементах bean, будет происходить в указанном пакете.
- constraint-definition — объявление собственного ограничения. В атрибуте annotation указывается класс аннотации, являющейся огранчиением, а в дочернем элементе validated-by — класс-валидатор, реализующий валидацию
- bean — объявления компонента, к которому следует применять валидацию. Имя класса указывается в атрибуте class, а ignore-annotations позволяет игнорировать существующие в классе аннотации Bean Validation.
Элемент bean может содержать множество различных комбинаций дочерних элементов в зависимости от используемых правил валидации.
Правила валидации класса
Правила валидации класса описываются элементом class:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8" ?> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" version="2.0"> <bean class="name.alexkosarev.notepad.note.Note"> <class> <!-- validation setup --> </class> </bean> </constraint-mappings> |
Правила валидации членов класса
Правила валидации членов классов описываются элементом field:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8" ?> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" version="2.0"> <bean class="name.alexkosarev.notepad.note.Note"> <field name="id"> <valid/> <constraint annotation="javax.validation.constraints.NotBlank"/> </field> </bean> </constraint-mappings> |
Правила валидации get-методов
Правила валидации get-методов описываются элементом getter:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8" ?> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" version="2.0"> <bean class="name.alexkosarev.notepad.note.Note"> <getter name="userAccountId"> <valid/> <constraint annotation="javax.validation.constraints.NotBlank"/> </getter> </bean> </constraint-mappings> |
Правила валидации конструкторов
Правила валидации конструкторов описываются элементом constructor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="UTF-8" ?> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" version="2.0"> <bean class="name.alexkosarev.notepad.note.Note"> <constructor> <parameter type="java.lang.String"> <valid/> <constraint annotation="javax.validation.constraints.NotBlank"/> </parameter> <!-- .. --> </constructor> </bean> </constraint-mappings> |
Правила валидации методов
Правила валидации методов описываются элементом method:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="UTF-8" ?> <constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" version="2.0"> <bean class="name.alexkosarev.notepad.note.NoteService"> <method name="findOneById"> <parameter type="java.lang.String"> <valid/> <constraint annotation="javax.validation.constraints.NotBlank"/> </parameter> <return-value> <valid/> <constraint annotation="javax.validation.constraints.NotNull"/> </return-value> </method> <method name="delete"> <parameter type="java.lang.String"> <valid/> <constraint annotation="javax.validation.constraints.NotBlank"/> </parameter> </method> </bean> </constraint-mappings> |
Для элементов bean, class, method, constructor, field и getter применим атрибут ignore-annotations, позволяющий игнорировать объявленные в коде при помощи аннотаций правила валидации. Данный атрибут распространяется только на элемент, к которому он объявлен, дочерние элементы не наследуют этот атрибут.