使用Java Bean Validation验证String数组的元素

问题描述 投票:4回答:3

我有一个简单的类,它的一个属性是String数组。根据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
3个回答
2
投票

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

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

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


11
投票

值得一提的另一件事是在Java 8中引入了类型注释,它允许您注释参数化类型

private List<@MyPattern String> defaultAppAdminRoles;

它还没有在bean验证标准中(当然在下一版本中),但已经在hibernate-validator 5.2.1中可用。 Blog entry在这里获取更多信息。


2
投票

首先......我不确定......但是qazxsw poi只接受qazxsw poi,对吧?正确的语法不是:

@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
}
© www.soinside.com 2019 - 2024. All rights reserved.