在Spirng Boot
项目中校验前端请求参数,高效易维护的手段推荐使用@Valid
和 @Validated
注解,开发时应当尽量避免使用一大堆if else
对请求参数一个个判断校验。
一、@Valid
和 @Validated
对比
对比项 | @Valid |
@Validated |
---|---|---|
提供方 | JSR-303规范,简单理解就是Java EE中定义的一套Java Bean校验规范 | Spring,可以理解成是对JSR-303规范规范的二次封装 |
包路径 | javax.validation |
org.springframework.validation.annotation |
标注位置 | 方法、对象属性、 构造方法、 参数 | 类、方法、参数 |
支持分组 | 不支持 | 支持 |
支持嵌套 | 支持 | 不支持 |
1. 关于Jar包和常用注解
(1)@Valid
在 jakarta.validation-api.jar
中,它是一套标注的JSR-303规范的实现,主要有以下注解:
(2)@Validated
在 Spring Boot
项目中主要是依赖 hibernate-validator.jar
,除了提供了JSR-303的规范,还扩展了一些注解,如下图所示:
所以在 Spring Boot
项目里面引入 spring-boot-starter-validation
,就会自动引入 hibernate-validator
的Jar包,hibernate-validator 官方文档。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
复制代码
二、@Valid
和 @Validated
使用技巧
1. 前端使用JSON串方式提交参数
Content-Type : application/json
,这种方式后端接口可以直接使用 Java Bean
对象来接受请求入参。
1.1 单个属性校验
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
@Getter
@Setter
public class ParamBody implements Serializable {
@NotEmpty(message = "hour不能空")
private String hour;
}
复制代码
我们使用 @Validated
来校验参数值,@RequestBody
接受JSON串参数。
1.2 嵌套属性校验
import lombok.Getter;
import lombok.Setter;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
@Getter
@Setter
public class ParamBody implements Serializable {
@Valid
@NotNull(message = "用户信息不能为空")
private User user;
@NotEmpty(message = "hour不能空")
private String hour;
}
复制代码
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
@Getter
@Setter
public class User implements Serializable {
@NotEmpty(message = "用户名称不能为空")
@Size(message = "用户名称不能超过 {max} 个字符", max = 10)
private String username;
}
复制代码
此时的嵌套意思就是校验 ParamBody
时也要对User
的所有属性进行校验,实现嵌套校验注意以下几点:
- 对要校验的嵌套属性必须使用
@Valid
注解标准 - 被嵌套的对象,也就是案例里的
User
对象内部属性校验时注解请使用javax.validation.constraints
包下的注解,不要使用org.hibernate.validator.constraints
包下的注解,有时候会导致校验失效!!!