@Past(groups = Payment.class)
private Date paymentDate;
Вы можете иметь столько групп, сколько требует ваша бизнес-логика, а также использовать то или иное ограничение с несколькими группами, поскольку атрибут groups может принимать целый массив групп:
@Past(groups = {Payment.class, Delivery.class})
private Date deliveryDate;
В каждой ограничивающей аннотации должен определяться элемент groups. Если ни одна группа не указана, то считается объявленной задаваемая по умолчанию группа javax.validation.groups.Default. Так, следующие ограничения являются эквивалентными и входят в состав группы Default:
@NotNull
private Long id;
@Past(groups = Default.class)
private Date creationDate;
Вновь рассмотрим случай с предшествующим использованием, в котором мы применяли аннотацию @ChronologicalDates, и задействуем в нем группы. В классе Order из листинга 3.18 содержится несколько дат, позволяющих отслеживать ход процесса заказа: creationDate, paymentDate и deliveryDate. Когда вы только создаете заказ на покупку, устанавливается атрибут creationDate, но не paymentDate и deliveryDate. Две эти даты нам потребуется валидировать позже, на другом этапе рабочего процесса, но не одновременно с creationDate. Применяя группы, можно валидировать creationDate одновременно с группой, проверяемой по умолчанию (поскольку для этой аннотации не указана никакая группа, для нее по умолчанию действует javax.validation.groups.Default). Атрибут paymentDate будет валидироваться на этапе Payment, а deliveryDate и @ChronologicalDates — на этапе Delivery.
@ChronologicalDates(groups = Delivery.class)
public class Order {
··@NotNull
··private Long id;
··@NotNull @Past
··private Date creationDate;
··private Double totalAmount;
··@NotNull(groups = Payment.class) @Past(groups = Payment.class)
··private Date paymentDate;
··@NotNull(groups = Delivery.class) @Past(groups = Delivery.class)
··private Date deliveryDate;
··private List<OrderLine> orderLines;
··// Конструкторы, геттеры, сеттеры
}
Как видите, в ходе валидации вам всего лишь следует явно указать, какие именно группы вы хотите проверить, и поставщик валидации из Bean Validation выполнит частичную проверку.
Дескрипторы развертывания
Как и большинство других технологий, входящих в состав Java EE 7, при валидации компонентов мы можем определять метаданные с помощью аннотаций (как это делалось выше) и с помощью XML. В Bean Validation у нас может быть несколько опциональных файлов, которые располагаются в каталоге META-INF. Первый файл, validation.xml, может применяться приложениями для уточнения некоторых особенностей поведения валидации компонентов (в частности, поведения действующего по умолчанию поставщика валидации компонентов, интерполятора сообщений, а также конкретных свойств). Кроме того, у вас может быть несколько файлов, описывающих объявления ограничений для ваших компонентов. Как и все дескрипторы развертывания в Java EE 7, XML переопределяет аннотации.
В листинге 3.19 показан дескриптор развертывания validation.xml, имеющий корневой XML-элемент validation-config. Гораздо важнее, что здесь определяется внешний файл для отображения ограничений: constraints.xml (показан в листинге 3.20).
<?xml version="1.0" encoding="UTF-8"?>
<validation-config
····xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
····xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
····xsi: schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration
·························validation-configuration-1.1.xsd"
····version="1.1">
··<constraint-mapping>META-INF/constraints.xml</constraint-mapping>
</validation-config>
<?xml version="1.0" encoding="UTF-8"?>
<constraint-mappings
····xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
····xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
····xsi: schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping
·························validation-mapping-1.1.xsd"
····version="1.1">
··<bean class="org.agoncal.book.javaee7.chapter03.Book" ignore-annotations="false">
····<field name="title">
······<constraint annotation="javax.validation.constraints.NotNull">