SpringBoot参数校验大全(分组校验、顺序校验、嵌套校验、自定义校验、常用注解校验)

日常开发工作中,少不了对请求参数进行校验,比如进行判空、长度限制等,如果每个参数都进行语句上的逻辑判断,会显得比较复杂,所以这里为大家介绍在SpringBoot开发过程中常用到的参数校验知识。

一、分组校验

首先定义一些接口,接口内不用写什么内容,仅用于区分分组。
在这里插入图片描述
然后在我们需要进行参数校验的类属性上,加入对应的校验注解,并设置分组类别,还可以加上一些提示信息。注意,对于没有加分组类别的注解,默认属于Default分组。
在这里插入图片描述
最后,在具体的方法处,使用 @Validated注解 设定分组,即可对实体类中的该组别的校验参数自动进行校验
在这里插入图片描述
注意,分组之间可以继承,A extends B 那么A中拥有B中所有的校验项。

二、顺序校验

在有些业务场景中,我们可能需要对参数进行顺序校验,比如先进行组别1的校验,再进行组别2的校验。这个时候可以在定义分组的时候使用 @GroupSequence注解,来制定校验顺序。
如下图所示,这里的SequentialCombination组别就是一个顺序校验组,在属性上使用的时候,该组别的校验规则就是,先对Add组别的参数进行校验,再对Update组别的参数进行校验。
在这里插入图片描述

三、嵌套校验

我们经常会遇到一种情况是,在某个实体类中定义一些List,而List里存的也是某个实体类。如下图所示,List中存放的是User,我们通过 @NotEmpty注解 只能判断List不为空,无法对内部的User参数进行校验,这个时候,就需要使用 @Valid注解,这样的话,在完成List类属性的校验后,会进入到List内部,进行User类的参数校验。这样便实现了嵌套校验。
在这里插入图片描述

四、自定义校验

(一)自定义校验注解

下面是自定义注解的样例,
使用 @Target({ElementType.FIELD}),表明该注解会作用在字段上,
使用 @Retention(RetentionPolicy.RUNTIME),表明该注解在运行时可以被JVM读取到,可以通过反射机制获取到注解信息,并且可以对注解进行处理。这意味着在运行时可以通过反射机制获取到被该注解修饰的元素上的注解信息,并且可以根据注解信息进行相应的处理操作。
使用 @Constraint(validatedBy = MyValidator.class),表明该注解用于定义验证约束,validatedBy属性指定了验证器类MyValidator。这意味着在使用该注解的类或方法上,会通过MyValidator验证器进行验证操作。

/**
 * @author Season
 * @date 2024-07-26 11:02
 * @description 自定义注解
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidator.class)
public @interface MyValidation {
    String message() default "提示信息";  //提示信息

    Class<?>[] groups() default {};  //组别

    Class<? extends Payload>[] payload() default {};  //负载,获取到state注解的附加信息
}

然后定义我们自定义注解 @MyValidation 的内容字段,一般来说,需要设置上面三种:分别是提示信息、组别、负载。

(二)自定义校验注解实现类

我们还需要编写自定义注解 @MyValidation 的具体实现类MyValidator,然后在实现类中编写具体的校验逻辑。该实现类需要实现ConstraintValidator<自定义注解名, String>。
然后重写isValid方法,该方法第一个参数是要进行处理的字段数值,通常是String类型的,后一个参数是固定的接收参数。这里我们进行的校验是判断字段是否为字母或者数字。

/**
 * @author Season
 * @date 2024-07-26 11:02
 * @description  自定义注解的实现类
 */
public class MyValidator implements ConstraintValidator<MyValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.matches("[A-Za-z0-9]+");
    }
}

五、常用注解校验

(一)简单判空

1. @NotBlank

字符串类型判空

@NotBlank String str;

2. @NotNull

基础类型判空,如int、long、byte等

@NotNull Integer num;
@NotNull Long count;
@NotNull Byte flag;

3. @NotEmpty

集合类型判空,如List、Set、Map等

@NotEmpty
private List<String> strs;

(二)参数长度校验

如下所示,设置参数长度在2和10之间

@Size(min = 2, max = 10)
private String str;

(三)正则判断

如下所示,设置参数为6位或8位数字

@Pattern(regexp = "^\\d{6}|\\d{8}$")
private String str;

(四)邮箱格式校验

@Email
private String mail;

(五)数值验证

设置基本数据类型字段最大值

@Max(value = 100)
private int sum;

设置基本数据类型最小值

@Min(value = 1)
private int sum;

设置复杂数据类型字段最大值

@DecimalMax(value = "10.5")
private BigDecimal sum;

设置复杂数据类型字段最小值

@DecimalMin(value = "0.0")
private BigDecimal sum;

确保字段为负数

@Negative
private int sum;

以上就是本次分享的全部内容啦!希望能够为大家提供一些帮助,也祝愿大家在工作中可以更加得心应手,0 Errors!!0 Warnings!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值