1 前言
说起参数校验我们应该不陌生了,参数校验确保输入数据的完整性和一致性,防止无效或不合法的数据被传递到后端。那么你会如何对参数进行校验,使用if-else
?这样不仅会造成代码冗余,我们写起来也麻烦。下面就来介绍使用SpringBoot Validation
来优雅的对参数进行校验。
2 实现
2.1 引入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.2 单个或多个参数校验
- controler上添加
Validated
注解开启接口校验 - 接口参数前使用校验注解(校验注解详情请看后面)
java
package com.example.controller;
@RestController
@Validated
public class TestController {
@PostMapping("/test1")
public String test1(@Length(min = 3, max = 15) String username) {
System.out.println(username);
return "请求成功";
}
}
2.3 对象校验
项目中POST
请求经常会接收一个对象,那么该如何对一个对象进行校验呢?下面讲介绍
- 提供对象,属性上添加校验规则
@Data
注解是Lombok中的一个注解,它主要用于自动生成Java类的一些通用方法,如toString、equals、hashCode和所有字段的getter和setter方法
java
package com.example.entity;
@Data
public class User {
@Length(min = 3, max = 15)
private String username;
@Length(min = 3, max = 15)
private String password;
}
- controler上添加
Validated
注解开启接口校验,接口参数前使用Valid
注解校验对象
java
package com.example.controller;
@RestController
@Validated
public class TestController {
PostMapping("/test2")
public String test2(@Valid User user) {
System.out.println(user);
return "请求成功";
}
}
2.4 异常处理
validation
校验参数失败会抛出异常,响应格式与我们项目中响应的格式不同,因此需要处理抛出的异常,异常处理详情请看SpringBoot全局异常处理 - 掘金 (juejin.cn)
ConstraintViolationException
:单个或多个参数校验失败MethodArgumentNotValidException
:对象参数校验失败
java
package com.example.controller;
@RestControllerAdvice
@Slf4j
public class ProjectExceptionAdvice {
@ExceptionHandler({ConstraintViolationException.class, MethodArgumentNotValidException.class})
public String error(Exception e){
log.info("请求参数异常!", e);
return Result.fail(400, "请求参数异常!");
}
}
3 校验注解
3.1 空值检查
注解 | 说明 |
---|---|
@NotBlank | 用于字符串,字符串不能为null 也不能为空字符串 |
@NotEmpty | 字符串同上,对于集合(Map,List,Set)不能为空,必须有元素 |
@NotNull | 不能为 null |
3.2 数值检查
注解 | 说明 |
---|---|
@DecimalMax(value) | 被注释的元素必须为数字,其值必须小于等于指定的值 |
@DecimalMin(value) | 被注释的元素必须为数字,其值必须大于等于指定的值 |
@Digits(integer, fraction) | 被注释的元素必须为数字,其值的整数部分精度为 integer,小数部分精度为 fraction |
@Positive | 被注释的元素必须为正数 |
@PositiveOrZero | 被注释的元素必须为正数或 0 |
@Max(value) | 被注释的元素必须小于等于指定的值 |
@Min(value) | 被注释的元素必须大于等于指定的值 |
@Negative | 被注释的元素必须为负数 |
@NegativeOrZero | 被注释的元素必须为负数或 0 |
3.3 Boolean 检查
注解 | 说明 |
---|---|
@AssertFalse | 被注释的元素必须值为 false |
@AssertTrue | 被注释的元素必须值为 true |
3.4 长度检查
注解 | 说明 |
---|---|
@Size(min,max) | 被注释的元素长度必须在 min 和 max 之间,可以是 String、Collection、Map、数组 |
3.5 日期检查
注解 | 说明 |
---|---|
@Future | 被注释的元素必须是一个将来的日期 |
@FutureOrPresent | 被注释的元素必须是现在或者将来的日期 |
@Past | 被注释的元素必须是一个过去的日期 |
@PastOrPresent | 被注释的元素必须是现在或者过去的日期 |
3.6 其他检查
注解 | 说明 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Pattern(regexp) | 被注释的元素必须符合正则表达式 |