Skip to content

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被注释的元素必须为nullObject
@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被注释的元素必须为trueboolean
@AssertFalse被注释的元素必须为falseboolean
@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)被注释的元素必须符合指定的正则表达式字符串
@Email被注释的元素必须是电子邮件地址,可以使用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;  
    }  
}