参数验证的对象有时候不是简单地POJO,可能是数据,集合,这时候就要用到@Valid
下面是这个注解上的注释:
@Target(value={CONSTRUCTOR, FIELD, METHOD, PARAMETER})
@Retention(value=RUNTIME)
Marks a property, method parameter or method return type for validation cascading.
Constraints defined on the object and its properties are be validated when the property, method parameter or method return type is validated.
This behavior is applied recursively.
Author:
Emmanuel Bernard
Hardy Ferentschik
可以看到可以用到属性,方法和返回值上, 该注解只要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,这样在检查当前对象的同时也会检查该字段所引用的对象
如果我们的Po是这样的
<pre name="code" class="java">class Object{
@Valid
List<Person> persons
}
那么要想验证list里面的PO必须加上@Valid ,如果Person里面还有List同样也需要加上@Valid才可以验证
需要注意的地方:
如果用hibernate版本
hibernate-validator-5.1.
那么JDK必须用1.7,我用1.6报如下错:
Caused by: : java/util/()Ljava/util/Iterator;jdk1.6中没有 ();这个方法,然而hibernate中会调用这个方法
private Iterator<?> createIteratorForCascadedValue(Type type, Object value, ValueContext<?, ?> valueContext) {
Iterator<?> iter = ();
if ( ( type ) ) {
iter = ( (Iterable<?>) value ).iterator();
();
}
else if ( ( type ) ) {
Map<?, ?> map = (Map<?, ?>) value;
iter = ().iterator();
();
}
else if ( ( type ) ) {
List<?> arrayList = ( (Object[]) value );
iter = ();
();
}
return iter;
}