Как я могу проверить два или больше поля в комбинации?

Я использую JPA 2.0/бывший в спящем режиме проверки для проверки моих моделей. У меня теперь есть ситуация, где комбинация двух полей должна быть проверена:

public class MyModel {
    public Integer getValue1() {
        //...
    }
    public String getValue2() {
        //...
    }
}

Модель недопустима если оба getValue1() и getValue2() null и допустимый иначе.

Как я могу выполнить этот вид проверки с JPA 2.0/быть в спящем режиме? С простым @NotNull аннотация оба метода считывания должна быть непустой для передачи проверки.

74
задан Pascal Thivent 6 May 2010 в 19:31
поделиться

1 ответ

Для проверки нескольких свойств следует использовать ограничения на уровне класса. Из Обзор проверки бина, часть 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  [] 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 }} по сравнению с другими подходами на уровне свойств , включающими зависимости. Мы будем рады вашим отзывам.

87
ответ дан 24 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: