首发博客地址
https://blog.zysicyj.top/
一、申请组
1. 人组
package org.hibernate.validator.referenceguide.chapter05;public class Person { @NotNull private String name; public Person(String name) { this.name = name; } // getters and setters ...}
2. 驱动组
public class Driver extends Person { @Min( value = 18, message = "You have to be 18 to drive a car", groups = DriverChecks.class ) public int age; @AssertTrue( message = "You first have to pass the driving test", groups = DriverChecks.class ) public boolean hasDrivingLicense; public Driver(String name) { super( name ); } public void passedDrivingTest(boolean b) { hasDrivingLicense = b; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
3. 汽车组
public class Car { @NotNull private String manufacturer; @NotNull @Size(min = 2, max = 14) private String licensePlate; @Min(2) private int seatCount; @AssertTrue( message = "The car has to pass the vehicle inspection first", groups = CarChecks.class ) private boolean passedVehicleInspection; @Valid private Driver driver; public Car(String manufacturer, String licencePlate, int seatCount) { this.manufacturer = manufacturer; this.licensePlate = licencePlate; this.seatCount = seatCount; } public boolean isPassedVehicleInspection() { return passedVehicleInspection; } public void setPassedVehicleInspection(boolean passedVehicleInspection) { this.passedVehicleInspection = passedVehicleInspection; } public Driver getDriver() { return driver; } public void setDriver(Driver driver) { this.driver = driver; } // getters and setters ...}
4. 应用验证组
// create a car and check that everything is ok with it.Car car = new Car( "Morris", "DD-AB-123", 2 );Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car );assertEquals( 0, constraintViolations.size() );// but has it passed the vehicle inspection?constraintViolations = validator.validate( car, CarChecks.class );assertEquals( 1, constraintViolations.size() );assertEquals( "The car has to pass the vehicle inspection first", constraintViolations.iterator().next().getMessage());// let's go to the vehicle inspectioncar.setPassedVehicleInspection( true );assertEquals( 0, validator.validate( car, CarChecks.class ).size() );// now let's add a driver. He is 18, but has not passed the driving test yetDriver john = new Driver( "John Doe" );john.setAge( 18 );car.setDriver( john );constraintViolations = validator.validate( car, DriverChecks.class );assertEquals( 1, constraintViolations.size() );assertEquals( "You first have to pass the driving test", constraintViolations.iterator().next().getMessage());// ok, John passes the testjohn.passedDrivingTest( true );assertEquals( 0, validator.validate( car, DriverChecks.class ).size() );// just checking that everything is in order nowassertEquals( 0, validator.validate( car, Default.class, CarChecks.class, DriverChecks.class).size());
二、组继承()
- 定义一个超级跑车
public class SuperCar extends Car { @AssertTrue( message = "Race car must have a safety belt", groups = RaceCarChecks.class ) private boolean safetyBelt; // getters and setters ...}
import javax.validation.groups.Default;public interface RaceCarChecks extends Default {}
- 应用组继承
// create a supercar and check that it's valid as a generic CarSuperCar superCar = new SuperCar( "Morris", "DD-AB-123", 1 );assertEquals( "must be greater than or equal to 2", validator.validate( superCar ).iterator().next().getMessage() );// check that this supercar is valid as generic car and also as race carSet<ConstraintViolation<SuperCar>> constraintViolations = validator.validate( superCar, RaceCarChecks.class );assertThat( constraintViolations ).extracting( "message" ).containsOnly( "Race car must have a safety belt", "must be greater than or equal to 2");
三、定义组序列()
- 定义序列组
import javax.validation.GroupSequence;import javax.validation.groups.Default;@GroupSequence({ Default.class, CarChecks.class, DriverChecks.class })public interface OrderedChecks {}
- 应用序列组
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({ 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; }}
public interface RentalChecks {}
- 应用从新定义的默认组
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() );
@GroupSequenceProvider
- 实现和应用默认组序列
public class RentalCarGroupSequenceProvider implements DefaultGroupSequenceProvider<RentalCar> { @Override 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; }}
@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; }}
五、组转换()
- 必须汇合@Valid哦,否则报错
public class Driver { @NotNull private String name; @Min( value = 18, message = "You have to be 18 to drive a car", groups = DriverChecks.class ) public int age; @AssertTrue( message = "You first have to pass the driving test", groups = DriverChecks.class ) public boolean hasDrivingLicense; public Driver(String name) { this.name = name; } public void passedDrivingTest(boolean b) { hasDrivingLicense = b; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // getters and setters ...}
@GroupSequence({ CarChecks.class, Car.class })public class Car { @NotNull private String manufacturer; @NotNull @Size(min = 2, max = 14) private String licensePlate; @Min(2) private int seatCount; @AssertTrue( message = "The car has to pass the vehicle inspection first", groups = CarChecks.class ) private boolean passedVehicleInspection; @Valid @ConvertGroup(from = Default.class, to = DriverChecks.class) private Driver driver; public Car(String manufacturer, String licencePlate, int seatCount) { this.manufacturer = manufacturer; this.licensePlate = licencePlate; this.seatCount = seatCount; } public boolean isPassedVehicleInspection() { return passedVehicleInspection; } public void setPassedVehicleInspection(boolean passedVehicleInspection) { this.passedVehicleInspection = passedVehicleInspection; } public Driver getDriver() { return driver; } public void setDriver(Driver driver) { this.driver = driver; } // getters and setters ...}
// create a car and validate. The Driver is still null and does not get validatedCar car = new Car( "VW", "USD-123", 4 );car.setPassedVehicleInspection( true );Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car );assertEquals( 0, constraintViolations.size() );// create a driver who has not passed the driving testDriver john = new Driver( "John Doe" );john.setAge( 18 );// now let's add a driver to the carcar.setDriver( john );constraintViolations = validator.validate( car );assertEquals( 1, constraintViolations.size() );assertEquals( "The driver constraint should also be validated as part of the default group", constraintViolations.iterator().next().getMessage(), "You first have to pass the driving test");
);