javaBean验证框架(7)—使用@valid实现对象关联验证

来源:互联网 发布:fwt算法 编辑:程序博客网 时间:2024/05/29 19:35

javaBean验证框架(7)—使用@valid实现对象关联验证

根据Bean验证规范,@Valid注解在对象引用上,从而实现级联验证。关联对象自身也可以包含级联引用,因此实现递归验证过程。该特性也被称为”对象图验证”。

示例说明

这里定义两个类,Driver和DriverLicense类,其中后者引用Driver类,从而用于演示级联验证。

Driver类

import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Past;import java.util.Date;public class Driver {    @NotNull    private String fullName;    @Min(100)    private int height;    @Past    @NotNull    private Date dateOfBirth;    public Driver(String fullName, int height, Date dateOfBirth) {        this.dateOfBirth = dateOfBirth;        this.fullName = fullName;        this.height = height;    }}

DriverLicense类

import javax.validation.Valid;import javax.validation.constraints.Digits;import javax.validation.constraints.NotNull;public class DriverLicense {    @NotNull    @Valid    private Driver driver;    @Digits(integer = 7, fraction = 0)    private int number;    public DriverLicense(Driver driver, int number) {        this.driver = driver;        this.number = number;    }}

演示验证类

import com.dataz.entity.Driver;import com.dataz.entity.DriverLicense;import javax.validation.*;import java.text.ParseException;import java.util.Date;import java.util.Set;public class ValidAnnotationDemo5 {    private static final Validator validator;    //获得验证器实例    static {        Configuration<?> config = Validation.byDefaultProvider().configure();        ValidatorFactory factory = config.buildValidatorFactory();        validator = factory.getValidator();        factory.close();    }    public static void main(String[] args) throws ParseException {        Driver driver = new Driver("Joseph Waters", 60,                new Date(System.currentTimeMillis() + 100000));        DriverLicense dl = new DriverLicense(driver, 3454343);        Set<ConstraintViolation<DriverLicense>> violations = validator.validate(dl);        if (violations.size() == 0) {            System.out.println("No violations.");        } else {            System.out.printf("%s violations:%n", violations.size());            violations.stream()                    .forEach(ValidAnnotationDemo5::printError);        }    }    private static void printError(ConstraintViolation<?> violation) {        System.out.println(violation.getPropertyPath()                + " " + violation.getMessage());    }}

输出结果

2 violations:

driver.dateOfBirth 需要是一个过去的事件

driver.height 最小不能小于100

读者可以尝试注释DriverLicense类中的@valid注解,运行结果没有违法约束。

总结

本节我们通过示例演示@valid注解实现级联验证。示例中有目的地给嵌套对象提供无效值,验证在创建父对象过程中是否对嵌套对象进行约束检查。