JSR 303 - 验证多个内部列表

4

我正在使用JSR 303,并编写了许多注释,因此我熟悉使自定义约束生效的过程。

我刚遇到一个问题,我不确定是否能优雅地解决。这里的对象仅用于说明!因此,我有一个祖父对象,它有一个子对象列表。每个孩子都有自己的孩子列表(显然是祖父母的孙子女)。可以使用@Size限制此列表的大小。但是,我需要限制祖父母的(孙)子女的总数,以便如果我验证祖父母实例,则它们在所有孩子中被限制为50个孙子女。奇怪的例子,我知道:-)

我通过在祖先中创建一个方法来开始处理此问题,该方法简单地计算祖先的孩子列表中的孩子列表中的所有元素的数量,并添加一个简单的@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

我可以通过反射/propertydescriptor获取这个值并检查最小/最大值。这样做听起来可以,但是否有更好的方法在JSR 303中?这种方法也可以,但需要更多的代码,仍然不理想。

最后,如果我想在list2中的条目数量上进行相同的检查怎么办?我不能重复CustomListSize,所以该如何处理 - 创建一个内部列表?

谢谢

克里斯

2个回答

1

我认为为您的祖先对象编写自定义验证器是一个不错的方法。

@InnerListSize(lists = {"list1", list2"}, min=0, max=50)
class GrandParent{
   List list1;
   List list2;

}

反射可以用于获取列表。一旦我们有了它们,计算总体大小就很容易了。验证器类不会特别复杂。


0
创建一个Grandparent的自定义验证器 public class GrandParentValidator implements 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 ;
      }

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接