1. 导包,引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 在实体要校验的字段上加上校验注解
@Data
public class User {
@NotNull(message = "用户id不能为空")
private Long id;
@NotNull(message = "用户账号不能为空")
@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
private String account;
@NotNull(message = "用户密码不能为空")
@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
private String password;
}
注解说明:
@AssertFalse 被注解的元素必须为 false
@AssertTrue 被注解的元素必须为 true
@DecimalMax(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Digits (integer, fraction) 被注解的元素必须是一个数字,其值必须在可接受的范围内
@Null 被注解的元素必须为空
@NotNull 被注解的元素必须不为空
@Min(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最大值
@Max(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注解的元素的长度必须在指定的范围内
@Past 被注解的元素必须是一个过去的日期
@Future 被注解的元素必须是一个未来的日期
@Pattern(value) 被注解的元素必须符合指定的正则表达式
3. Controller 中添加注解@Valid
@RestController
public class UserController {
@PostMapping("/addUser")
public void addUser(@RequestBody @Valid User user) {
//业务
}
}
4. 自定义异常捕获
抛出的异常是MethodArgumentNotValidException,为了格式复合代码风格,自己定义抛出的异常格式
RespResult是自己项目的公共返回类
@RestControllerAdvice
@Slf4j
public class IDAASExceptionAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
public RespResult handleError(MethodArgumentNotValidException e){
log.warn("Method Argument Not Valid",e);
BindingResult bindingResult = e.getBindingResult();
FieldError fieldError = bindingResult.getFieldError();
String message = String.format("%s",fieldError.getDefaultMessage());
return RespResult.error(ComErrorCode.PARAM_VALID_ERROR.getCode(),message);
}
}
分组校验
场景:在新增时我们需要id为空,但修改时我们又需要id不为空,总不可能搞两个类吧,这时候分组校验的用处就来了
@Data
public class User {
public interface Insert{
}
public interface Update{
}
//
@NotNull(message = "用户id不能为空",groups = Update.class) //更新时不能为null
@Null(message = "用户id必须为空",groups = Insert.class) //插入时运行为null
private Long id;
}
在控制器中
@PostMapping("/add")
public void add(@RequestBody @Validated(User.Insert.class) User user) {
//添加时就用User.Insert.class,就不会校验id不为空。 修改时就用User.Update.class
}