问题场景: 类A继承类B,类A,B有相同的字段,并且都用了@NotBlank注解。在参数都设置正确的情况下,使用Validator.validate校验类A参数是否符合规则时,报错参数不符合规则
代码如下
//实体类
@Data
public class A extends B {
@NotBlank
private String name;
private String score;
@Valid
private C c;
}
@Data
public class B {
@NotBlank
private String name;
private String score;
}
@Data
public class C {
@NotBlank
private String age;
private String sex;
}
//设置值
public .... pottBean(){
A a=new A();
a.setName("小明");
check(a);
}
//校验方法
public .....check(Object obj){
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);
//这个地方校验出来的,就是不符合规则的参数名,发现name也在其中,我也设置了值 ,百思不解
}
后来查找多方资料得知,Validator的验证组概念。
Bean Validation 规范中一个重要的概念,就是组和组序列。组定义了约束的子集。对于一个给定的 Object Graph 结构,有了组的概念,则无需对该 ObjectGraph 中所有的约束进行验证,只需要对该组定义的一个子集进行验证即可。完成组别验证需要在约束声明时进行组别的声明,否则使用默认的组 Default.class。组也有继承的属性。对某一组别进行约束验证的时候,也会对其所继承的基类进行验证。所以当我校验A参数时候,会对基类B进行校验
苦逼的我又一次栽在这个地方了,当需要校验实体类中的包含的对象时候,需要在该对象上添加@Valid注解 , 长点心吧