1 简介
Spring Validation是Spring Framework的一部分,用于对客户端传递到服务端的参数进行校验,用于判定请求参数的合法性。
2 常见注解
我们在使用Spring Validation对客户端传递的参数进行校验时,通常会借助如下相关注解,对服务端接收客户端参数的对象进行描述。
-
@NotNull:用于验证字段对象是否为null
@NotNull(message = "用户名不能为null") -
@NotEmpty:用于验证字符串是否为空,并且会检查是否为null值(为null值时报错)
@NotEmpty(message = "用户名不能为null、空字符串") -
@NotBlank:不允许是“仅由空格、TAB等空白值组成的字符串”,也不允许为空字符串,也不允许为空值null
@NotBlank(message = "用户名不能为null、空字符串和空白串") -
@Size:检查字符串长度或集合大小。
@Size(min = 6, max = 20, message = "用户名长度必须在6到20之间") -
@Range:检查数值范围。
@Range(min = 1, max = 10, message = "年龄必须在1-10岁之间")
@Range(min = 0.1, max = 1.0, message = "成绩必须在0.1到1.0之间") -
@Email:检查字符串是否符合电子邮件格式。 -
@Pattern:检查字符串是否符合正则表达式模式。
@Pattern(regexp = "^[\\u4e00-\\u9fa5]{0,7}$|^[a-zA-Z]{0,14}$", message = "用户名不能超过7个汉字或14个英文字符")
3 快速入门实现[POJO参数校验]
- 第1步:在项目中添加验证依赖[创建工程时可勾选]
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 第2步:在
POJO类型的参数上添加@Validated注解,表示需要通过Spring Validation框架检查此参
@ApiOperation(value = "注册功能")
@PostMapping("reg")
public JsonResult reg(@RequestBody @Validated UserRegParam userRegParam){}
- 第3步:在
POJO类属性上,添加对应的验证注解,以配置验证规则;
@Data
public class UserRegParam {
@Pattern(regexp = "^[\\u4e00-\\u9fa5]{0,7}$|^[a-zA-Z]{0,14}$", message = "用户名不能超过7个汉字或14个英文字符")
private String username;
...
...
}
- 第4步:在全局异常处理类中定义异常处理方法
- 第4.1步: 自定义枚举状态码
VALIDATE_ERROR(3002, "参数校验失败") - 第4.2步: 定义异常处理方法
在处理异常时,需要调用MethodArgumentNotValidException对象的getFieldError().getDefaultMessage()获取以上配置的描述文本
- 第4.1步: 自定义枚举状态码
@ExceptionHandler
public JsonResult handleBindException(MethodArgumentNotValidException ex){
/*
ex.getFieldError().getDefaultMessage():获取 @NotNull(message="xxx") 中message的消息
*/
String message = ex.getFieldError().getDefaultMessage();
return new JsonResult(StatusCode.VALIDATE_ERROR, message);
}
4 非pojo参数校验
在 Spring Validation中,除了对 POJO(Plain Old Java Object)进行校验的功能外,还支持对非 POJO进行校验。
4.1 使用流程
- 第1步:在当前方法所在的类上添加
@Validated注解 - 第2步:在参数上添加对应的检查注解
4.2 应用实践
对于删除车辆功能的 id 参数进行范围校验,范围只能在200-300之间
- 第1步:在
Controller类上添加 @Validated 注解,例如:
@Validated
public class VehicleController {}
- 第2步:在
Controller类方法参数添加校验注解的描述,例如:
@PostMapping("del/{id}")
public JsonResult deleteVehicle(@PathVariable @Range(min = 200, max=300, message = "请提交合法的ID值!") Long id, @ApiIgnore HttpSession session){}
- 第3步:在全局异常处理类中添加异常处理方法
@ExceptionHandler
public JsonResult handleConstraintViolationException(ConstraintViolationException e) {
String data = ex.getMessage();
return new JsonResult(StatusCode.VALIDATE_ERROR, data);
}