在Bean Validation中,我们可以通过将约束注释分组来轻松定义验证组并控制验证顺序。例如,假设我们有以下User类定义:
public class User {
@NotNull(groups = FirstLevelCheck.class)
@Size(min = 5, max = 20, groups = SecondLevelCheck.class)
private String username;
@NotNull(groups = FirstLevelCheck.class)
@Email(groups = SecondLevelCheck.class)
private String email;
@NotNull(groups = SecondLevelCheck.class)
@Size(min = 8, max = 20, groups = ThirdLevelCheck.class)
private String password;
}
我们可以定义3个不同的验证组:
public interface FirstLevelCheck {}
public interface SecondLevelCheck {}
public interface ThirdLevelCheck {}
在这种情况下,我们可以验证整个实体,只需指定所需的约束组即可:
public boolean validateUser(User user) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set> violations = validator.validate(user, FirstLevelCheck.class, SecondLevelCheck.class, ThirdLevelCheck.class);
return violations.isEmpty();
}
尤其是在多步骤表单中,您可能需要以不同的顺序验证不同的约束组。对于这种情况,Bean Validation为我们提供了一种组序列的概念,使第一组的约束被检查完后,第二组的约束被检查,以此类推。例如,如果我们希望按顺序验证我们的User实体,我们可以使用如下注释:
@GroupSequence({FirstLevelCheck.class, SecondLevelCheck.class, ThirdLevelCheck.class})
public class User {
// ...
}
这告诉Bean Validation按照我们指定的顺序验证约束组。那么我们只需要像这样验证实体:
public boolean validateUser(User user) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set> violations = validator.validate(user);
return violations.isEmpty();
}
注意,我们没有在验证方法中指定组。由于我们定义了一个组序列,Bean Validation现在可以按顺序处理组。
总而言之,使用组和组序列是将Bean Validation与复杂对象和表单结合使用的强大工具。
上一篇:Bean验证 - 验证可选字段