前言
spring-boot中在Controller层里面可以用@validated来校验数据再进入业务逻辑层,如果数据异常则会统一抛出异常,方便异常中心统一处理。
比如,我们判断一个输入的用户名长度限制以及密码的正则验证.
使用流程
1.Controller层数据使用@validated注解
@PostMapping("/userLogin")
@ResponseBody
public TResult login(@RequestBody(required=true) @Validated User user) {
return accountServiceInter.login(user);
}
}
2 然后在model上声明需要被校验的字段
@Pattern(regexp = "^[a-zA-Z0-9_]{4,16}$", message = "用户名必需4-16位")
private String username;
//用户密码
@Pattern(regexp ="^[a-zA-Z0-9_]{6,16}$", message = "用户名必需6-16位")
private String password;
3.全部异常捕获
/**
* 处理所有接口数据验证异常
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public TResult handleValidException(MethodArgumentNotValidException e) {
logger.error("程序验证错误",e);
TResult tResult = TResultEncap.setErrResult(ReturnCodeBase.ERR6000);
tResult.setErrMsg(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return tResult;
}
当输入不能满足条件是,就会抛出异常,而后统一由异常中心处理,推荐这种方式
也可以用BindingResult,但是用了这个后就必须手动处理异常,侵入了正常的逻辑过程。
常用注解类型
@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,
inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验
嵌套校验
如果一个类中包含了另外一个实体类,那么在上面加上@Validated即可,比如下面的
public class Student{
@validated
private List< User>studentList;
}