作者:吴声子夜歌
普通校验
普通检验是基础用法,非常容易,首先需要用户在SpringBootWeb项目中添加数据校验相关的依赖:
org.springframework.boot spring-boot-starter-validation
查看LocalValidatorFactoryBean类的源码,发现默认的ValidationMessageSource(校验出错时的提示文件) 是resources目录下的ValidationMessages.properties 文件,因此在resources目录下创建ValidationMessages.properties文件,内容如下:
user.name.size=用户名长度介于5到10个字符之间user.address.notnull=用户地址不能为空user.age.size=年龄输入不正确user.email.notnull=邮箱不能为空user.email.pattern=邮箱格式不正确
创建User类,配置数据校验:
public class User { private Integer id; @Size(min = 5, max = 10, message = "{user.name.size}") private String name; @NotNull(message = "{user.address.notnull}") private String address; @DecimalMin(value = "1", message = "{user.age.size}") @DecimalMax(value = "200", message = "{user.age.size}") private Integer age; @Email(message = "{user.email.pattern}") @NotNull(message = "{user.email.notnull}") private String email; //省略getter和setter}
- @Size表示一个字符串的长度或者一个集合的大小,必须在某一个范围中;min参数表示范围的下限;max参数表示范围的上限;message表示校验失败时的提示信息。
- @NotNull注解表示该字段不能为空
- @DecimalMin注解表示对应属性值的下限
- @DecimalMax注解表示对应属性值的上限
- @Email注解表示对应属性格式是一个Email
创建UserController:
@RestControllerpublic class UserController { @PostMapping("/user") public List addUser(@Validated User user, BindingResult result){ List errors = new ArrayList<>(); if(result.hasErrors()){ List allErrors = result.getAllErrors(); for(ObjectError error : allErrors){ errors.add(error.getDefaultMessage()); } } return errors; }}
- 给User参数添加@Validated注解,表示需要对该参数做校验,紧接着的BindingResult参数表示在校验出错时保存的出错信息。
- 如果BindingResult中的haiErrors方法返回true,表示有错误信息,此时遍历错误信息,将之返回给前端
使用Postman测试:
直接访问"/user"接口:
传入用户地址、一个非法邮箱地址以及一个格式不正确的用户名:
分组校验
有的时候,开发者在某一个实体类中定义了很多校验规则,但是在某一次业务处理中,并不需要这么多校验规则,此时就可以使用分组校验:
首先创建两个分组接口:
public interface ValidationGroup1 {}public interface ValidationGroup2 {}
在实体类中添加分组信息:
public class User { private Integer id; //groups属性,表示该校验属性规则所属的分组 @Size(min = 5, max = 10, message = "{user.name.size}", groups = ValidationGroup1.class) private String name; @NotNull(message = "{user.address.notnull}", groups = ValidationGroup2.class) private String address; @DecimalMin(value = "1", message = "{user.age.size}") @DecimalMax(value = "200", message = "{user.age.size}") private Integer age; @Email(message = "{user.email.pattern}") @NotNull(message = "{user.email.notnull}", groups = {ValidationGroup1.class, ValidationGroup2.class}) private String email;}
在@Validated注解中指定校验分组:
@RestControllerpublic class UserController { //@Validated(ValidationGroup2.class) 表示这里的校验使用ValidationGroup2分组的校验规则,即只校验邮箱地址是否为空、用户地址是否为空 @PostMapping("/user") public List addUser(@Validated(ValidationGroup2.class) User user, BindingResult result){ List errors = new ArrayList<>(); if(result.hasErrors()){ List allErrors = result.getAllErrors(); for(ObjectError error : allErrors){ errors.add(error.getDefaultMessage()); } } return errors; }}
测试: