入参自定义校验

前言

在进行web开发时,使用springboot开发的web项目 ,前端想后端传入参数时,使用post 或者put提交时 ,后台往往使用VO类进行接收,我们要对入参的格式进行校验,这里说明不能单单的只进行前端校验。防止他人绕过网页进行数据提交。

前提我们这里所说的所有规则都基于JSR303规则

JSR是Java Specification Requests的缩写,意思是Java 规范提案。
是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。
任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

这里要介绍的是基于注解的方式进行校验

  • 首先 要先确定你使用的springboot的版本是否高于2.3.x版本,超过的话加入以下依赖。
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.20.Final</version>
        </dependency>

我们实际中经常使用的有:

@ NotNull
@ Null
@ NotBlank
@ URL
@ Pattern
@ Min
@ Max
@ Email
@ Length

等等一些。这些都是javax.validation.constraints包下的。我们只需要在controller层的方法中接收实体类前加上@Validated 或者@Valid 注解即可完成入参校验。

  • 当然这些校验规则也是支持分组校验的。

举例:

@ NotNull(groups = {UpdateGroup.class}))

说明:
UpdateGroup.class 为自定义的一个接口,不需要继承或定义任何属性,只起标识作用。

例如我定义的接口规定为更新组。我们只需要在更新的controller方法的VO实体类前面添加@Validated(UpdateGroup.class)给他设置校验组即可让上面的注解生效。
注意:@Validated(UpdateGroup.class) 设置校验组后,实体类上没有规定所属组的注解将不生效。


实现自定义校验

  • 编写一个自定义校验注解
  • 编写一个自定义的校验器
  • 关联自定义的校验器和自定义校验注解

下面开始编码:
我们这里自定义一个校验注解@ListValue(vals = {0,1},groups = {AddGroup.class})

  • 自定义校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/*
*
* 自定义校验注解
*
* */
@Documented
// 使用什么校验器校验 这里是一个集合,可以设置多个类型,会自动去匹配
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    // 可以读取配置文件中的也可以在这里写死
    String message() default "{com.wdhcr.common.valid.ListValue.message}";
    
    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
    // 以上三个属性  只要规范 JSR303 规则 就必须有以上三个属性。

	// 下面的为自定义的属性
    int[] vals() default {};
}

在resources 目录下 创建ValidationMessages.properties配置文件 在配置文件中添加后面的配置:
com.wdhcr.common.valid.ListValue.message = 只能设置规定的值
String message() default “{com.wdhcr.common.valid.ListValue.message}”;

  • 自定义校验器
import org.springframework.util.ObjectUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/*
* @ListValue 的自定义校验器
* 
*
* */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
    private Set<Integer> set = new HashSet<Integer>();

    /*
    * 初始化方法
    *
    * */
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
            if (!ObjectUtils.isEmpty(val)) {
                set.add(val);
            }
        }
    }

    // 判断是否校验成功
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        // 判断是否包含传进来的值
        return set.contains(value);
    }
}

ConstraintValidator<ListValue,Integer>
ListValue: 为自定义校验注解
Integer:为注解要校验的数据类型。可以设置为double 等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值