使用 Java Bean Validation 验证 String 数组的元素
Validate elements of a String array with Java Bean Validation
我有一个简单的 class,它的一个属性是字符串数组。根据 this 文档,在数组、集合等上使用 @Valid 将递归验证 array/collection.
的每个元素
@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 验证来验证 array/collection 的正确方法是什么?
如果是正确的,那是不是Apache BVal的一些限制?
首先...我不确定...但是 @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;
通过像您所做的那样添加 @Valid
注释,验证算法将应用于每个元素(元素约束的验证)。
在您的情况下,字符串 class 没有任何限制。您添加的 @Pattern
约束应用于数组而不是数组的每个元素。由于 @Pattern
约束不能应用于数组,您会收到一条错误消息。
您可以为数组创建自定义验证约束(有关详细信息,请参阅 Hibernate docs)或者您可以使用包装器 class,就像提到的 @Jordi Castilla。
另一件值得一提的事情是在 Java 8 中引入了类型注释,它可以让你注释参数化类型
private List<@MyPattern String> defaultAppAdminRoles;
它还没有在 bean-validation 标准中(肯定在下一个版本中),但在 hibernate-validator 5.2.1 中已经可用。 Blog entry 点击此处获取更多信息。
我有一个简单的 class,它的一个属性是字符串数组。根据 this 文档,在数组、集合等上使用 @Valid 将递归验证 array/collection.
的每个元素@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 验证来验证 array/collection 的正确方法是什么?
如果是正确的,那是不是Apache BVal的一些限制?
首先...我不确定...但是 @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;
通过像您所做的那样添加 @Valid
注释,验证算法将应用于每个元素(元素约束的验证)。
在您的情况下,字符串 class 没有任何限制。您添加的 @Pattern
约束应用于数组而不是数组的每个元素。由于 @Pattern
约束不能应用于数组,您会收到一条错误消息。
您可以为数组创建自定义验证约束(有关详细信息,请参阅 Hibernate docs)或者您可以使用包装器 class,就像提到的 @Jordi Castilla。
另一件值得一提的事情是在 Java 8 中引入了类型注释,它可以让你注释参数化类型
private List<@MyPattern String> defaultAppAdminRoles;
它还没有在 bean-validation 标准中(肯定在下一个版本中),但在 hibernate-validator 5.2.1 中已经可用。 Blog entry 点击此处获取更多信息。