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 ;
      }

}

Другие вопросы по тегам