SpringBoot Validation 参数校验
依赖
implementation 'org.springframework.boot:spring-boot-starter-validation'
注解
@Validated
用于在 Spring 控制器层方法参数进行验证
@PostMapping("/validator")
public String ValidatorTest(@RequestBody @Validated UserParam user) {
return "success";
}
@Valid
是 Java 标准的一部分,用于声明需要对嵌套对象进行递归验证。在 Spring 框架中,通常用于处理复杂对象结构的验证,如验证对象中的集合或对象引用的属性
@Data
public class EmpParam implements Serializable {
@NotBlank(message = "员工手机号不能为空")
private String empPhone;
@Valid
@NotNull(message = "部门信息不能为空")
private DeptParam deptParam;
}
@Data
public class DeptParam implements Serializable {
@NotNull(message = "部门ID不能为空")
private Long deptId;
@NotBlank(message = "部门名称不能为空")
private String deptName;
}
@NotNull
注解用于检查被注解的元素值不为 null。适用于字符串、集合、Map 等任何对象类型,但不适用于基本数据类型(如 int、long 等)
常用于检查对象是否为 null
@NotNull(message = "员工ID不能为空")
private Long empId;
@NotNull(message = "部门信息不能为空")
private DeptParam deptParam;
@NotBlank
用于检查被注解的字符串元素不为 null 且去除两端空白字符后长度大于 0。只适用于字符串类型。
@NotBlank(message = "员工身份证号不能为空")
private String empIdCard;
@NotEmpty
注解用于检查被注解的元素不为 null 且不为空,适用于字符串、集合、Map 等。
如果是字符串,相当于同时检查 null 和长度大于 0
@NotEmpty
private List<String> emails;
@Pattern
指定字段必须符合指定的正则表达式
c
@Pattern(regexp ="^1[3|4|5|6|7|8|9][0-9]\d{8}$")
private String phone
@Email
指定字段必须符合Email格式。
c
@Email
private String email;
@Size
指定字段的长度范围
c
@Size(min = 6, max = 20)
private String password;
常用注解
constraint | 说明 | 支持类型 |
---|---|---|
@Null | 被注释的元素必须为null | Object |
@NotNull | 被注释的元素不能为null,但可以为empty,没有Size的约束 | Object |
@NotEmpty | [字符串、数组、集合、Map]不能为null&长度不为0 | 字符串、Object[]、基础类型数组、[Collection、Map]接口实现类 |
@NotBlank | 只用于String,不能为null且trim()之后size>0 | 字符串 |
@Length | 字符串长度为min至max之间 | 字符串 |
@Size(max,min) | [字符串、数组、集合、Map]长度为min至max之间 | 字符串、Object[]、基础类型数组、[Collection、Map]接口实现类 |
@Range | [字符串、数字]大小在min和max之间,字符串必须是数字格式 | 数值、数值格式的字符串 |
@AssertTrue | 被注释的元素必须为true | boolean |
@AssertFalse | 被注释的元素必须为false | boolean |
@Min(value) | [字符串长度、数字]不能小于value | 数值、数值格式的字符串 |
@Max(value) | [字符串长度、数字]不能大于value | 数值、数值格式的字符串 |
@DecimalMin(value) | 被注释的元素必须是一个数字,不能小于等于value; inclusive为false时, 不能小于value | 数值、数值格式的字符串 |
@DecimalMax(value) | 被注释的元素必须是一个数字,不能大于等于value; inclusive为false时, 不能大于value | 数值、数值格式的字符串 |
@Digits(integer,fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内,整数位数不能大于integer, 小数位数不能大于fraction | 数值、数值格式的字符串 |
@Past | 被注释的元素必须是一个过去的日期 | 时间 |
@PastOrPresent | 只能是过去时间或当前时间 | 时间 |
@Future | 被注释的元素必须是一个将来的日期 | 时间 |
@FutureOrPresent | 只能是未来时间或当前时间 | 时间 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 | 字符串 |
被注释的元素必须是电子邮件地址,可以使用regex指定格式 | 字符串 | |
@Negative | 只能为负数 | 数值 |
@NegativeOrZero | 只能为负数或0 | 数值 |
@Positive | 只能为正数 | 数值 |
@PositiveOrZero | 只能为正数或0 | 数值 |
使用@Valid
或者 @Validated
验证。
使用@RequestBody
验证body数据。
模式
- 效验模式:如果出现多个字段效验失败,会返回所有的验证失败错误信息。通常情况下,当第一个字段/参数效验失败时,直接返回。
- 普通模式:默认使用的就是普通模式,校验完所有的属性之后,返回所有的验证失败信息。
- 快速失败模式:只要有一个字段效验失败,直接返回。
自定义注解
// 定义注解,判断用户ID是否存在
package io.ms.common.validation;
import jakarta.validation.Constraint;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = SysUserIdExistsValidator.class) //注解实现
@Target({ElementType.FIELD, ElementType.METHOD}) // 注解可以应用于字段和方法上
@Retention(RetentionPolicy.RUNTIME) // 表示注解在运行时保留,因此可以通过反射机制读取。强调,可以通过反射获取,
public @interface SysUserIdExists {
String message() default "用户编号不存在";
Class<?>[] groups() default {};
Class<?>[] payload() default {};
}
// 注解实现
package io.ms.common.validation;
import io.ms.system.service.ISysUserService;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.dromara.hutool.extra.spring.SpringUtil;
public class SysUserIdExistsValidator implements ConstraintValidator<SysUserIdExists, String> {
@Override
public void initialize(SysUserIdExists constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
var u = SpringUtil.getBean(ISysUserService.class).selectUserById(Long.valueOf(s));
return u != null && u.getUserId() != null;
}
}