我有一个简单的类,它的一个属性是String数组。根据{{3}}文档,在数组上使用@Valid,集合等将递归验证数组/集合的每个元素。
<div id="countdown">01:02:15</div>
属性上面的注释会生成以下异常:
@Valid
@Pattern(regexp="^[_ A-Za-z0-9]+$")
public String[] defaultAppAdminRoles;
我使用Apache BVal作为验证提供商。
问题,上述方法是否正确?如果不正确,使用bean验证验证数组/集合的正确方法是什么?
如果它是正确的,那么它是Apache BVal的一些限制吗?
答案 0 :(得分:11)
值得一提的另一件事是在Java 8中引入了类型注释,它允许您注释参数化类型
private List<@MyPattern String> defaultAppAdminRoles;
它还没有在bean验证标准中(当然在下一版本中),但已经在hibernate-validator 5.2.1中可用。 Blog entry这里有更多信息。
答案 1 :(得分:2)
首先......我不确定......但@Pattern
只接受regex
,对吧?正确的sintax不是:
@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;
答案 2 :(得分:2)
通过添加您已完成的@Valid
注释,验证算法将应用于每个元素(元素约束的验证)。
在您的情况下,String类没有约束。您添加的@Pattern
约束将应用于数组,而不是应用于数组的每个元素。由于@Pattern
约束无法应用于数组,因此您收到错误消息。
您可以为数组创建自定义验证约束(有关详细信息,请参阅Hibernate docs),或者您可以使用@Jordi Castilla提到的包装类。