【问题标题】:Validate elements of a String array with Java Bean Validation使用 Java Bean Validation 验证 String 数组的元素
【发布时间】:2015-08-18 09:53:35
【问题描述】:

我有一个简单的类,它的属性之一是字符串数组。根据this 文档,在数组、集合等上使用@Valid 将递归地验证数组/集合的每个元素。

@Valid
@Pattern(regexp="^[_ A-Za-z0-9]+$")
public String[] defaultAppAdminRoles;

属性上的上述注释会产生以下异常:

Exception in thread "main" javax.validation.UnexpectedTypeException: No validator could be found for type java.lang.String[]. See: @Pattern at public java.lang.String[] com.hm.vigil.platform.ops.model.Application.defaultAppAdminRoles
at org.apache.bval.jsr303.AnnotationProcessor.checkOneType(AnnotationProcessor.java:326)
at org.apache.bval.jsr303.AnnotationProcessor.getConstraintValidator(AnnotationProcessor.java:301)
at org.apache.bval.jsr303.AnnotationProcessor.applyConstraint(AnnotationProcessor.java:241)
at org.apache.bval.jsr303.AnnotationProcessor.processAnnotation(AnnotationProcessor.java:149)
at org.apache.bval.jsr303.AnnotationProcessor.processAnnotations(AnnotationProcessor.java:90)
at org.apache.bval.jsr303.Jsr303MetaBeanFactory.processClass(Jsr303MetaBeanFactory.java:134)
at org.apache.bval.jsr303.Jsr303MetaBeanFactory.buildMetaBean(Jsr303MetaBeanFactory.java:95)
at org.apache.bval.MetaBeanBuilder.buildForClass(MetaBeanBuilder.java:131)
at org.apache.bval.MetaBeanManager.findForClass(MetaBeanManager.java:102)
at org.apache.bval.jsr303.ClassValidator.validate(ClassValidator.java:140)
at com.hm.vigil.platform.commons.AbstractValidatable.isValid(AbstractValidatable.java:33)
at com.hm.vigil.platform.ops.model.Application.main(Application.java:54)

我使用 Apache BVal 作为验证提供程序。

问题,上面的方法正确吗?

如果不正确,使用 bean 验证来验证数组/集合的正确方法是什么?

如果它是正确的,那么它是 Apache BVal 的一些限制吗?

【问题讨论】:

    标签: java bean-validation indexed-properties


    【解决方案1】:

    另外值得一提的是在 Java 8 中引入了类型注解,它可以让你对参数化类型进行注解

    private List<@MyPattern String> defaultAppAdminRoles;
    

    它还没有在 bean-validation 标准中(肯定会在下一个版本中),但在 hibernate-validator 5.2.1 中已经可用。 Blog entry在这里了解更多信息。

    【讨论】:

    【解决方案2】:

    通过像您所做的那样添加@Valid 注释,验证算法将应用于每个元素(元素约束的验证)。

    在您的情况下,String 类没有约束。您添加的 @Pattern 约束应用于数组而不是数组的每个元素。由于@Pattern 约束不能应用于数组,因此您会收到一条错误消息。

    您可以为您的数组创建自定义验证约束(请参阅Hibernate docs 了解更多信息),或者您可以使用@Jordi Castilla 提到的包装类。

    【讨论】:

      【解决方案3】:

      首先...我不确定...但@Pattern 只接受regex,对吗?正确的语法不是:

      @Pattern("^[_ A-Za-z0-9]+$")   // delete 'regexp='
      

      如果这不是问题,您可以在属性中创建带有验证器的wrapper class

      public class Role {
      
          @Pattern(regexp="^[_ A-Za-z0-9]+$")
          String adminRole;
      
          //getters and setters
      }
      

      然后只需在现有对象中标记@Valid字段即可:

      @Valid
      Role[] defaultAppAdminRoles;
      

      【讨论】:

      • 您还需要在 Wrapper 类中添加单个字符串构造函数来实现这一点。 public Role(String adminRole){ this.adminRole = adminRole; }
      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2019-03-25
      • 2021-02-08
      相关资源
      最近更新 更多