一.校验组序列

默认情况下,约束的验证是没有一定的顺序的,不管他们是属于哪个认证组的.但是在有些环境中,我们控制这些约束验证的顺序还是很有用的.

就拿我们上一个例子来说,我们可以这样:首先在我们检查车的性能之前关于车的默认的约束应该是验证通过的,然后,在我们行驶之前,我们应该检查驾驶员的相关约束条件.为了实现这样的认证顺序,我们要定义一个新的接口,在这个接口上面加上一个@GroupSequence 注释,用来定义我们验证组执行的顺序

注意:验证组中如果有一个约束失败了,那么后面的约束将都会认为是失败的.

如下:

@GroupSequence({Default.class, CarChecks.class, DriverChecks.class})
public interface OrderedChecks {
}

警告
一个校验组序列中包含的校验组和这个校验组序列不能造成直接或者间接的循环
引用. 包括校验组继承. 如果造成了循环引用的话, 会导
致 GroupDefinitionException 异常.

定义好了之后,就来使用:

@Test
public void testOrderedChecks() {
Car car = new Car( "Morris", "DD-AB-123", 2 );
car.setPassedVehicleInspection( true );
Driver john = new Driver( "John Doe" );
john.setAge( 18 );
john.passedDrivingTest( true );
car.setDriver( john );
assertEquals( 0, validator.validate( car, OrderedChecks.class ).size() );
}

二.对一个类重定义其默认校验组

这个@GroupSequence的注释还有第二种作用,它可以用来让你重新定义一个类的默认组的方法.为了重新定义类.我们只需要在这个类上加一个@GroupSequence注解

这个注解中定义的组的组序列将会替代这个类的默认的.

例:

第一步.先来一个出租车的认证组

package test01;

/**
* @author Administrator
*出租车认证组
*/
public interface RentalChecks { }

2.再来一个出租车类

package test01;

import javax.validation.GroupSequence;
import javax.validation.constraints.AssertFalse; @GroupSequence({ RentalChecks.class, CarChecks.class, RentalCar.class })
public class RentalCar extends Car {
/**
* 是否已经出租
*/
@AssertFalse(message = "The car is currently rented out", groups = RentalChecks.class)
private boolean rented; public RentalCar(String manufacturer, String licencePlate, int seatCount) {
super(manufacturer, licencePlate, seatCount);
} public boolean isRented() {
return rented;
} public void setRented(boolean rented) {
this.rented = rented;
}
}

注意:由于在认证组中不能有循环依赖且当给一个类重新定义组序列时认证组序列中不能加入默认(Default)组,所以我们需要将这个类本身添加进去,如上例!

3.最后进行测试

@Test
public void carIsRented() {
RentalCar rentalCar = new RentalCar("Morris", "DD-AB-123", 2);
rentalCar.setPassedVehicleInspection(true);
rentalCar.setRented(true);
Set<ConstraintViolation<RentalCar>> constraintViolations = validator.validate(rentalCar);
assertEquals(1, constraintViolations.size());
assertEquals("Wrong message", "The car is currently rented out",
constraintViolations.iterator().next().getMessage());
rentalCar.setRented(false);
constraintViolations = validator.validate(rentalCar);
assertEquals(0, constraintViolations.size());
}

注意:

当在一个类上加@GroupSequence时,它是不会传递到相关的对象中,这意味着如果你在上面的例子中添加了DriverChecks 是没有效果的.只有当认证一个实例的时候,才会有效果

三.@GroupSequenceProvider

关于前面的@javax.validation.GroupSequence 注解是一个标准的Bean认证注解,正如前面所见的它能够让你静态的重新定义一个类的默认认证组的组顺序,Hibernate Validator同时也提供了一个可以自己操作的,非标准的注解org.hibernate.validator.group.GroupSequenceProvider,它能够让你动态的重新定义一个组的顺序.

1.先创建一个GroupSequenceProvider用来动态选择认证组

public class RentalCarGroupSequenceProvider implements DefaultGroupSequenceProvider<RentalCar> {
public List<Class<?>> getValidationGroups(RentalCar car) {
List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();
defaultGroupSequence.add( RentalCar.class );
if ( car != null && !car.isRented() ) {
defaultGroupSequence.add( CarChecks.class );
}
return defaultGroupSequence;
}
}

2.使用这个GroupSequenceProvider

@GroupSequenceProvider(RentalCarGroupSequenceProvider.class)
public class RentalCar extends Car {
@AssertFalse(message = "The car is currently rented out", groups = RentalChecks.class)
private boolean rented;
public RentalCar(String manufacturer, String licencePlate, int seatCount) {
super( manufacturer, licencePlate, seatCount );
}
public boolean isRented() {
return rented;
}
public void setRented(boolean rented) {
this.rented = rented;
}

hibernate_validator_07的更多相关文章

随机推荐

  1. 汇编cmp比较指令详解

    刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...

  2. java学习之数组(一)【内存】

    在java语言当中,为了更方便多个数据的管理,这里提供数组. 比如说,现在我们有一组数据,7,8,9,9,为了保存这四个数据,我们分别要定义变量来保存,少了还好说.但是假如,有100多个数据呢,我们一 ...

  3. Linux 多线程调试(内存占用、死循环、CPU占用率高……)

    文章出处:http://www.cnblogs.com/cy568searchx/archive/2013/10/28/3391790.html 你的软件在某个时刻停止服务,CPU占用达到100%+, ...

  4. SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色【正品 价格 图片 折扣 评论】_尚品网ShangPin.com

    SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色[正品 价格 图片 折扣 评论]_尚品网ShangPin.com

  5. DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试

    1.测试环境: 硬件环境: 数据库服务器:2U*8核 8G内存 测试服务器:   2U*8核 6G内存 软件环境: jdk: 1.6.29 mysql: 5.0.77 mysql_driver: my ...

  6. web —— jsp笔记

    cookies 的使用 1.首先确保客户机上允许使用cookie,一般在浏览器的 隐私 设置项里可以设置. 2.下面给出具体的例子 a)index.jsp中如果没注册过,让游客注册,如果注册了,拿出贮 ...

  7. 用canvas把图片变成黑白相片

    <!--这里没有代码--> 原来是把灰度系数分别 乘以 每个像素点的三个像素色(R,G,B)的值,然后得到的三个值加起来,再把得到的值赋值进去给每个R ,G,B. 微软的MSDN上提到的是 ...

  8. Java同步工具类总结

    先谈谈闭锁和栅栏的区别: 1.关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行. 2.闭锁用于等待某一个事件的发生,举例:CountDownLatch中await方法等待计数器为零时,所有事件 ...

  9. 004_Eclipse编写第一个Java_Web程序

    1.MyEclipse的菜单栏--File--Web Project,新建一个web工程 Project name 填上自己的项目名称,例如HelloWorld. 需要选择Java EE版本以及Tar ...

  10. java+ mysql 给所有的表添加假数据

    需求:别的项目, 代码扣过来了, 数据库也拿过来了, 但是数据库全是空表, 一共700 张表,需求是给表添加假数据,让它能运行起来. 一下是代码实现: 1.数据库连接: public static C ...