0. 前言
前一篇 java 校验框架 - Bean Validation 简单的介绍了 Bean Validation
并进行了简单的使用。但在实际使用过程中,一个类会应用到多个场景, 而不同的业务场景下对于属性的约束也不同。
以订单的新增和更新对数据库表进行操作。通常新增时不需要id,而更新时需要。这种情况应该怎么办。这就是我们要说的分组校验功能。
1. 定义 Order
Order
是一个实体,且在内部定义了分组接口 Add
和 Update
。
public class Order {
// 定义分组标识接口 add 操作
public interface Add{}
// 定义分组标识接口 update 操作
public interface Update{}
@Null(groups = Add.class) // add 分组
@NotNull(message="订单号不能为空", groups = Update.class) // update 分组
private Long id;
@NotNull(message = "下单用户不能未空")
private String userName;
...
}
2. 分组校验工具类
public static void validWithGroup(Object obj, Class... groups) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Object>> validates = validator.validate(obj, groups);
Iterator<ConstraintViolation<Object>> iterator = validates.iterator();
while (iterator.hasNext()) {
String message = iterator.next().getMessage();
// 输出校验信息
System.out.println(message);
}
}
这个 validWithGroup
方法新增了可变长的 Class 参数,用于指定校验分组。
3. 测试
public static void valid() {
Order order = new Order();
order.setUserName("zhang3")
// 新增时
validWithGroup(order, Order.Add.class, Default.class);
// 更新时
Order order2 = new Order();
order2.setId(1);
order2.setUserName("zhang13");
validWithGroup(order2, Order.Update.class);
}
以上调用 validWithGroup
时,我们根据不同场景加入了 Add Update 校验分组,且在新增操作时,加了 Default.class
这个分组。
注意:
当我们定义了分组后,对于如上校验规则就会按分组走,当出现可能有些校验不生效的情况,这时需要将 Default.class 加入校验分组。
就是这么简单,赶快快动手用起来吧。如果有任何问题,欢迎一起讨论。