使用Java Bean Validation验证字符串数组的元素

7

我有一个简单的类,其中一个属性是字符串数组。根据这个文档,对数组、集合等使用@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的某些限制吗?

3个回答

18

值得一提的是,在Java 8中引入了类型注解,可以为参数化类型添加注解。

private List<@MyPattern String> defaultAppAdminRoles;

这个特性目前还没有被包含在Bean验证标准里(但肯定会在下个版本中加入),不过已经在Hibernate-Validator 5.2.1中可以使用。请参考博客入口以获取更多信息。


https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#type-arguments-constraints - o_nix
1
注意:为了向后兼容性,需要创建自定义验证器。 - o_nix

3
通过添加像你所做的@Valid注释,每个元素都会应用验证算法(验证元素约束)。
在你的情况下,String类没有任何限制。你添加的@Pattern约束应用于数组而不是每个元素。由于@Pattern约束不能应用于一个数组,所以你会收到一个错误消息。
你可以为你的数组创建一个自定义验证约束(请参见Hibernate文档了解更多信息),或者你可以像@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;

你还需要在你的包装类中添加一个单字符串构造函数来实现这个。 public Role(String adminRole){ this.adminRole = adminRole; } - Vibhum Bhardwaj

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