参数校验 Spring Validation框架
后端参数校验
解决:校验前端传入的参数是否符合预期
1、引入依赖
使用Spring Validation框架
<!-- validation参数校验框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.1.4</version>
</dependency>
2、校验类型
-
直接属性校验
-
对象属性校验
2.1 直接属性校验
在参数接收时,直接使用正则表达式对属性进行限制。
-
控制层添加注解@Validated
-
接口参数接收添加注解@Pattern
2.2 对象属性校验
-
实体类属性校验规则准备
-
接口参数封装 并添加注解@Validated
@RestController
@Validated
public class LoginController{
@Autowired
private LoginService loginService;
// 注册
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password){
//逻辑......
}
}
实体类
<!-- Lombok 用于类方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
UserPO.java
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.util.Date;
@Data // 自动生成getter和setter方法,以及toString、equals和hashCode方法
@NoArgsConstructor // 自动生成无参构造函数
@AllArgsConstructor // 自动生成全参构造函数
public class UserPO {
@NotNull
private Integer id; // ID
@NotEmpty // 值不能为空
@Pattern(regexp = "^.{5,16}$") // 长度在5到16之间的非空字符
private String username; // 用户名
@NotEmpty // 值不能为空
@Pattern(regexp = "^.{5,16}$") // 长度在5到16之间的非空字符
private String password; // 密码
@NotEmpty // 值不能为空
@Pattern(regexp = "^.{1,10}$") // 长度在1到10之间的非空字符
private String nickname; // 昵称
@NotEmpty // 值不能为空
@Email // 邮箱格式
private String email; // 邮箱
private String userPic; // 头像
private Date createTime; // 创建时间
private Date updateTime; // 修改时间
}
接口
@PostMapping("/update")
public Result update(@RequestBody @Validated UserPO userPO) {
userService.update(userPO);
return Result.success("完成更新用户");
}
统一返回类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//统一响应结果
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private Integer code;//业务状态码 0-成功 1-失败
private String message;//提示信息
private T data;//响应数据
//快速返回操作成功响应结果(带响应数据)
public static <E> Result<E> success(E data) {
return new Result<>(0, "操作成功", data);
}
//快速返回操作成功响应结果
public static Result success() {
return new Result(0, "操作成功", null);
}
public static Result error(String message) {
return new Result(1, message, null);
}
}