参数校验

一、简述

数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。

JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!

校验的时候实际用的是 Hibernate Validator 框架。Hibernate Validator 是 Hibernate 团队最初的数据校验框架,Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的参考实现,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)的参考实现,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的参考实现。

SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。如下图所示(通过 idea 插件—Maven Helper 生成):

非 SpringBoot 项目需要自行引入相关依赖包。需要注意的是所有的注解,推荐使用 JSR 注解,即javax.validation.constraints,而不是org.hibernate.validator.constraints。

二、一些常用的字段验证的注解

  • @NotEmpty 被注释的字符串的不能为 null 也不能为空
  • @NotBlank 被注释的字符串非 null,并且必须包含一个非空白字符
  • @Null 被注释的元素必须为 null
  • @NotNull 被注释的元素必须不为 null
  • @AssertTrue 被注释的元素必须为 true
  • @AssertFalse 被注释的元素必须为 false
  • @Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
  • @Email 被注释的元素必须是 Email 格式。
  • @Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max=, min=)被注释的元素的大小必须在指定的范围内
  • @Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
  • @Past被注释的元素必须是一个过去的日期
  • @Future 被注释的元素必须是一个将来的日期
    ......

三、验证请求体(RequestBody)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
 @NotNull(message = "classId 不能为空")
 private String classId;
 @Size(max = 33)
 @NotNull(message = "name 不能为空")
 private String name;
 @Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可选范围")
 @NotNull(message = "sex 不能为空")
 private String sex;    @Email(message = "email 格式不正确")
 @NotNull(message = "email 不能为空")
 private String email;
}

在需要验证的参数上加上了@Valid注解,如果验证失败,它将抛出MethodArgumentNotValidException。

@RestController
@RequestMapping("/api")
public class PersonController {
@PostMapping("/person")    
public ResponseEntity getPerson(@RequestBody @Valid Person person) {
  return ResponseEntity.ok().body(person);
 }
}

四、验证请求参数(Path Variables 和 Request Parameters)

一定不要忘记在类上加上 Validated 注解,这个参数可以告诉 Spring 去校验方法参数。

@RestController
@RequestMapping("/api")
@Validated
public class PersonController {    
 @GetMapping("/person/{id}")   
 public ResponseEntity getPersonByID(@Valid @PathVariable("id")
@Max(value = 5,message = "超过 id 的范围了") Integer id) {
   return ResponseEntity.ok().body(id); 
  }
}

你可能感兴趣的:(参数校验)