前言
之前的案例在使用@Validated进行校验时,校验条件绑定了Java Bean。在实际应用中,一个类可能有几十个字段,针对不同的接口可能需要验证的约束也不同。
比如Person类,PersonId为主键,根据主键查询接口,PersonId不能为空。新增接口时,无需PersonId,而只是对姓名和性别进行非空判断,此时就会出现问题。
为了解决上述问题,@Validated支持分组策略,每个校验注解可以划分为一个或多个分组,通过分组配置满足不同接口同一校验Bean的需求。
案例
- 创建分组,分组是一个接口(接口中无方法),同时可以继承其他的组,这里创建一个Selcet和一个Insert,表示查询和新增分组。
public interface Select {
}
public interface Insert {
}
- 创建Person类,添加校验注解及指定分组
@Data
public class Person {
@NotNull(message = "personId不能为null",groups = Select.class)
private Integer personId;
@NotEmpty(message = "name不能为空",groups = Insert.class)
private String name;
private Integer age;
}
- 创建查询和新增接口,添加@Validated注解,指定分组,可多个。
@GetMapping("/select")
public Object select(@Validated({Select.class}) Person person) {
return person;
}
@GetMapping("/insert")
public Object insert(@Validated(Insert.class) Person person) {
return person;
}
-
访问查询接口,http://localhost:8000/test/select,发现只对personId进行了校验,分组生效
-
访问查询接口,http://localhost:8000/test/insert?name=111,发现只对name进行了校验,personId校验未开启,分组生效