数据校验规则
数据校验是开发过程中一个常见的环节,一般来说,为了提高系统运行效率,都会在前端进行数据校验,但是这并不意味着不必在后端做数据校验了,因为用户还是可能在获取数据接口后手动传入非法数据,所以后端还是需要做数据校验。 Spring Boot 对此也提供了相 的自动化配置解决方案。
1、普通校验
1.1 引入相关依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>
1.2 resource目录下创建配置文件ValidationMessages.properties
user.name.size=用户名的长度在5到10个字符之间user.address.notnull=用户地址不能为空user.age.size=年龄输入不正确user.email.notnull=邮箱不能为空user.email.pattern=不正确的电子邮件格式
1.3 创建需要校验的实体类
import javax.validation.constraints.*;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 ;//省略get/set方法}
代码解释:
- @Size 示一个字符串的长度或者一个集合的大小,必须在某一个范围中; min 参数表示范围的下限; max参数表示范围的上限; message 表示校验失败时的提示信息。
- @NotNull 注解表示该字段不能为空。
- @DecimalMin 注解表示对应属性值的下限,@DecimalMax 注解表示对应属性值的上限
- @Email 注解表示对应属性格式是一个 Email
1.4 创建 UserController
@RestControllerpublic class UserController { @PostMapping("/user") public List<String> addUser(@RequestBody @Validated User user, BindingResult result) { List<String> errors = new ArrayList<>(); if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError error : allErrors) { errors.add(error.getDefaultMessage()); } } return errors; }}
2、分组校验
有的时候开发者在某一个实体类中定义了很多校验规 ,但是在某一次业务处理中,并不需要这么多校验规,次时就可以使用分组校验。
2.1 分别创建两个分组接口
public interface ValidationAddGroup {}public interface ValidationUpdateGroup {}
2.2 需要校验的实体类
public class User { private Integer id; @Size(min = 5, max= 10 , message = "{user.name.size}", groups = ValidationAddGroup.class) private String name ; @NotNull(message ="{user.address.notnull}",groups = ValidationUpdateGroup.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 = ValidationUpdateGroup.class) private String email ;}
controller
@PostMapping("/user1")public List<String> addUser1(@RequestBody @Validated(ValidationAddGroup.class) User user, BindingResult result) { List<String> errors = new ArrayList<>(); if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError error : allErrors) { errors.add(error.getDefaultMessage()); } } return errors;}
3、校验注解
校验时返回的提示乱码解决办法如下: