hibernate 级联验证-@Valid (JDK1.7)

参数验证的对象有时候不是简单地POJO,可能是数据,集合,这时候就要用到@Valid

下面是这个注解上的注释:

 javax.validation.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.2.Final.jar

那么JDK必须用1.7,我用1.6报如下错

Caused by: java.lang.NoSuchMethodError: java/util/Collections.emptyIterator()Ljava/util/Iterator;
jdk1.6中没有 Collections.emptyIterator();这个方法,然而hibernate中org.hibernate.validator.internal.engine.ValidatorImpl会调用这个方法

	private Iterator<?> createIteratorForCascadedValue(Type type, Object value, ValueContext<?, ?> valueContext) {
		Iterator<?> iter = Collections.emptyIterator();
		if ( ReflectionHelper.isIterable( type ) ) {
			iter = ( (Iterable<?>) value ).iterator();
			valueContext.markCurrentPropertyAsIterable();
		}
		else if ( ReflectionHelper.isMap( type ) ) {
			Map<?, ?> map = (Map<?, ?>) value;
			iter = map.entrySet().iterator();
			valueContext.markCurrentPropertyAsIterable();
		}
		else if ( TypeHelper.isArray( type ) ) {
			List<?> arrayList = Arrays.asList( (Object[]) value );
			iter = arrayList.iterator();
			valueContext.markCurrentPropertyAsIterable();
		}
		return iter;
	}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值