Я использую JPA 2.0/бывший в спящем режиме проверки для проверки моих моделей. У меня теперь есть ситуация, где комбинация двух полей должна быть проверена:
public class MyModel {
public Integer getValue1() {
//...
}
public String getValue2() {
//...
}
}
Модель недопустима если оба getValue1()
и getValue2()
null
и допустимый иначе.
Как я могу выполнить этот вид проверки с JPA 2.0/быть в спящем режиме? С простым @NotNull
аннотация оба метода считывания должна быть непустой для передачи проверки.
Для проверки нескольких свойств следует использовать ограничения на уровне класса. Из Обзор проверки бина, часть II: пользовательские ограничения :
Ограничения на уровне класса
Некоторые из вас выразили озабоченность по поводу возможности применения { {1}} ограничение, охватывающее несколько свойств , или для выражения ограничения , которое зависит от нескольких свойств. Классическим примером является проверка адреса . Адреса имеют сложные правила:
- название улицы в некоторой степени стандартно и обязательно должно иметь ограничение по длине
- структура почтового индекса полностью зависит от страны
- город часто может быть соотнесен с почтовым индексом и некоторая проверка ошибок может быть выполнена (при условии, что служба проверки доступна)
- из-за этих взаимозависимостей простое ограничение уровня свойства отвечает требованиям
Решение, предлагаемое спецификацией Bean Validation, является двояким:
- оно предлагает возможность принудительно применить набор ограничений перед другим набором ограничений через {{ 1}} использование групп и групповых последовательностей. Эта тема будет рассмотрена в следующей записи блога
- , она позволяет определять ограничения уровня класса
Ограничения уровня класса являются обычными {{ 1}} (дуэт аннотация / реализация), которые применяются к классу , а не к свойству.Иначе говоря, ограничения уровня класса получают экземпляр объекта (а не значение свойства) в
isValid
.@AddressAnnotation Адрес публичного класса { @NotNull @Max (50) private String street1; @Max (50) private String street2; @ Макс (10) @NotNull private String zipCode; @Max (20) @NotNull String city; @NotNull private Country country; ... { {1}}} @ Constraint (validatedBy = MultiCountryAddressValidator.class) @ Target (ElementType.TYPE) @ Retention (RetentionPolicy.RUNTIME) {{ 1}} public @interface AddressAnnotation { String message () default "{error.address}"; Class > [] Groups () default {}; Class extends Payload> [] payload () default {}; } открытый класс MultiCountryAddressValidator реализует ConstraintValidator
{ public void initialize (AddressAnnotation constraintAnnotation ) { // инициализируем службу корреляции почтового индекса / города / страны } / ** * Проверяем почтовый индекс и город в зависимости от country * / public boolean isValid (Address object, ConstraintValidatorContext context) { if (! (object instanceof Address)) { выбросить новое исключение IllegalArgumentException ("@ Адрес применяется только к Address "); } Address address = (Address) объект; Country country = address.getCountry (); if (country. getISO2 () == "FR") { // проверяем структуру address.getZipCode () для Франции (5 чисел) // проверяем корреляцию почтового индекса и города (вызов внешней службы?) { {1}} return isValid; } else if (country.getISO2 () == "GR") { // проверяем структуру address.getZipCode () для Греции / / нет почтового индекса / cit корреляция y доступна на данный момент return isValid; } // ... } } Расширенные правила проверки адреса были исключены из объекта адреса и реализованы {{1} }
MultiCountryAddressValidator
. Благодаря доступу к экземпляру объекта ограничения уровня класса обладают большой гибкостью и могут проверять несколько коррелированных свойств. Обратите внимание, что упорядочение не входит в уравнение , мы вернемся к нему в следующей публикации.Группа экспертов обсудила различные подходы с поддержкой нескольких свойств : мы думаем, что подход с ограничениями на уровне класса обеспечивает как достаточную простоту, так и гибкость {{1 }} по сравнению с другими подходами на уровне свойств , включающими зависимости. Мы будем рады вашим отзывам.