当前位置: 首页 > 知识库问答 >
问题:

JSR 303-验证多个内部列表

潘皓
2023-03-14

我正在使用JSR303,并编写了大量注释,因此我熟悉使用自定义约束的过程。

我刚刚遇到了一个问题,我不确定我能否优雅地解决。这里的对象是为了说明!所以我有一个祖父母对象,它有一个孩子的列表。每个孩子都有自己的孩子列表(显然是祖父母的孙子)。此列表的大小可以用@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

我显然可以通过反射/属性描述符得到这个并检查最小/最大值。这听起来不错吗,或者在JSR 303中有没有更好的方法是我缺少的。这也可以,但需要更多的代码,而且仍然不理想。

最后,如果我想对list2中的条目数进行相同的检查怎么办?我不能重复CustomListSize,那么如何做到这一点-有一个内部列表?

谢谢

克莉丝

共有2个答案

陶征
2023-03-14

为祖父母创建自定义验证器

公共类祖父母验证器实现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 ;
      }

}

东方俊力
2023-03-14

我认为为您祖父对象定制验证器是一个好方法。

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

}

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

 类似资料:
  • 我缺少一些真正基本的东西(与EAR或EAR配置中的类加载相关)。我不明白,为什么我的JSR303验证和Hibernate验证不是从EAR内部触发的...如果我创建一个新的战争项目,它就会触发。 我正在Weblogic Server10.3上用Maven、JSF2.0、Open-JPA、EJB3.0建立一个新项目。我使用maven原型创建了所有项目。我有一个最终的EAR构建,它的结构如下: 项目名称

  • 我正在使用spring(4.2.0.RELEASE)、hibernate validator(5.2.1.Final)和validation api(1.1.0.Final)对后端应用程序进行JSR验证,配置如下:, 但是没有一个JSR303注释在我的应用程序中工作。 注意:在POJO类上添加了JSR303注释,在服务类(使用POJO)上添加了@Validated注释,还尝试在方法级别添加@Val

  • null 问题是: 当添加以下依赖项以实现“Spring Webflux+SpringFox+JSR303”时, 我得到以下错误, 另外,如果当前不支持JSR303,那么除了JSR303之外,还可以使用哪些其他验证注释?我不想使用Swagger核心注释,只是因为它会扰乱代码的可读性。

  • 我按照这个教程https://spring framework . guru/spring-boot-restful-API-documentation-with-swagger-2/生成了一个swagger文档。它可以工作,但是当我试图在bean中添加一些验证时,我在文档中找不到信息: 带有验证注释的我的实体: 这里,https://github.com/springfox/springfox/

  • 问题内容: 这是我第一次在这里发帖,如果我出错了,抱歉。 我正在处理一个JTable,其中的列数据必须验证一些参数,例如: 第3列的值> 30 第4列的值> 10 第5列的值> 4 另外,前2列也被“自动”填充,其余的列则为0。 如果该数据是正确的,则在第5栏中,我将显示一个勾号图像,否则,我将显示一个警告图像。 为了验证这一点,我使用以下代码 此代码的问题是返回堆栈溢出,我不知道该如何处理。 还

  • 我有一个Play 2.0.1应用程序,正在通过spring data binder掌握表单处理的窍门,如文档中所述。我有一个表单,假设一个用户给另一个用户发送消息,看起来像这样: 我的自定义绑定器确保用户(由他的id以超文本标记语言-form表示)得到正确的序列化,并且当不存在这样的用户时默认为空。 我正在考虑编写额外的验证,即确保通过表单传递的用户是试图发布消息的用户的朋友。这基本上是一种-注释