JSR 303 - проверка нескольких внутренних списков
Я использую JSR 303 и написал ряд аннотаций, поэтому я знаком с процессом получения пользовательских ограничений.
Я только что столкнулся с проблемой, которую не уверен, что смогу решить элегантно. Объекты здесь для иллюстрации! Итак, у меня есть дедушка, у которого есть список детей. У каждого ребенка есть свой список детей (от внуков до бабушки и дедушки, очевидно). Размер этого списка можно ограничить с помощью @Size. Но мне нужно ограничить ОБЩИЙ размер числа (внучатых) детей от дедушки и бабушки, чтобы, если я проверю экземпляр "Дедушки", их число будет ограничено 50 внуками на всех их детей. Странный пример, я знаю:-)
Я начал это с создания в бабушке и дедушке метода, который просто подсчитывает все элементы в дочерних списках дочерних списков в GrandParent и добавляет к этому простую аннотацию @Size. Это кажется немного уродливым - добавление такого метода, который служит только для проверки. Разве это не было частью того, что JSR должен был решить?
Или - создайте пользовательскую аннотацию следующим образом:
@CustomListSize(listName="children.children", min=0, max=50)
Grandparent
--> List<Child> children
@Size(min=0, max=5)
-->List<Child> children
--> List<Object> list1
-->List<Object> list2
Я, очевидно, могу получить это с помощью отражения / свойства дескриптора и проверить по значению мин / макс. Это звучит нормально или есть лучший способ в JSR 303, который мне не хватает. Это тоже работает, но требует больше кода и все еще не идеально.
Наконец, что если я захочу сделать такую же проверку количества записей в list2? Я не могу повторить CustomListSize, так как это сделать - иметь внутренний список?
Спасибо
Крис
2 ответа
Я думаю, что пользовательский валидатор для вашего дедушкиного объекта будет хорошим подходом.
@InnerListSize(lists = {"list1", list2"}, min=0, max=50)
class GrandParent{
List list1;
List list2;
}
Отражение может быть использовано для получения списков. Как только они у нас есть, их легко рассчитать. Класс валидатора не будет особенно сложным.
Создать собственный валидатор для дедушки и бабушки
открытый класс GrandParentValidator реализует ConstraintValidator {
@Override
public boolean isValid(GrandParent bean,
ConstraintValidatorContext ctx) {
//Count the number of Grandkids
int noOfGrandKids = 0 ;
for (Children child :bean.getAllChild() ){
noOfGrandKids += child.getAllChild().size ;
}
if (int noOfGrandKids > 50){
ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate("Invalid -More than 50 Grandkids found").addConstraintViolation();
return false ;
}
return true ;
}
}