我们有时需要对前端传过来的数据做校验,就可以使用spring validation。他可以使我们不用在每个Controller编写校验代码,可以达到解耦的功能。本文环境为jdk8,框架使用springboot 2.1.0.RELEASE。
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.需要被校验的实体类
@Data
public class LoginVo {
@Size(min=6,max = 12,message = "用户名不符合规范")
String username;
@NotBlank(message = "密码不能为空")
String password;
}
3.Controller层,在参数Login前加上@Validated注解,表明需要spring对其进行校验
public JSONResult registerOrLogin(@Validated LoginVo loginVo)
JSR提供的校验注解:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator提供的校验注解:
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
4.如果前端传来的数值不符合标准,后端会报错,所以我们可以编写一个全局异常类来捕获这个参数绑定异常,从而给前端返回提示消息
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)//拦截所有异常
public JSONResult exceptionHandler(HttpServletRequest request, Exception e){
e.printStackTrace();
if(e instanceof BindException) {
BindException ex = (BindException)e;
List<ObjectError> errors = ex.getAllErrors();//绑定错误返回很多错误,是一个错误列表,只需要第一个错误
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return JSONResult.errorMsg("用户名或密码格式错误");
}else {
return JSONResult.errorMsg("未知错误");
}
}
}
5.验证
前端:
后端:
如图,后端捕获了异常,并向前端返回了提示信息
6.我们还可以使用分组功能,是变量在某些场景需要被验证,而不是所有场景,增加灵活性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。