• 自定义校验注解


    自定义校验注解

    在前后端分离的开发中,我们常见的使用Validator进行校验,但是有时候这个框架的一些注解并不能满足我们生产中的所有需求,就比如后端需要判断一个状态值只能是0或者1或者2,这个时候就需要自定义一个注解了。

    自定义注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD,ElementType.PARAMETER})
    // FlagValidatorClass.class 这个类就是验证是否通过
    @Constraint(validatedBy = FlagValidatorClass.class)
    public @interface FlagValidator {
         // value就是需要传值的,这里使用数组,即前端传来的值只要这个数组里存在就通过
        int[] value() default {};
        // 参数校验失败的时候返回的默认信息
        String message() default "flag is not found";
        // 分组使用
        Class<?>[] groups() default {};
        // 不知道是啥,反正都有,写上总没错
        Class<? extends Payload>[] payload() default {};
    }
    

    自定义校验逻辑

    //第一个参数需要指定为你自定义的校验注解类
    // 第二个指定为你要校验属性的类型,如果前端传的是List那这里的Integer就变成List<String>,就是需要接受前端数据的数据类型
    //isValid方法中就是具体的校验逻辑
    public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Integer> {
    
        private FlagValidator constraint;
    
         // 一般来说如果用到了自定义注解里面的值,从这个初始化方法中给全局变量赋值,方便isValis()方法中使用
        @Override
        public void initialize(FlagValidator constraint) {
            this.constraint = constraint;
        }
    
        /**
         * 第一个参数value就是接收到的前端的值
         * 第二个参数目前没用到
         * 如果返回true就表示通过,false就表示校验失败,返回默认的信息
         */
        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
          // 如果前端不传值返回false,返回错误异常
          if(value == null) {
            	return false;
          }	
            // 这个values就是你放在注解上的value数组,即 @FlagValidator(value = {0,1},message = "预约状态参数错误") 这里面的value值
          	int[] values = constraint.value();
            // 遍历设定的值,当有一个值等于的话,就放行,否则拒绝放行
            for (int i : values) {
                if (i == value) {
                    return true;
                }
            }
            return false;
        }
    }
    

    在字段上添加自定义注解

    /**
     * 预约状态 0未启动 1启用中
     */
    @NotNull(message = "预约状态不可为空",groups = CreateGroup.class)
    @FlagValidator(value = {0,1},message = "预约状态参数错误")
    private Integer roomAppStatus;
    

    这个时候,前端传来值0或者1都可以放行通过,只要前端传的不是0或者1或者为空的话,就会返回异常信息。

  • 相关阅读:
    TypeScript中处理大数字(会丢失后面部分数字)
    多行字符串换行符(`) + 模板字符串
    ES6 阮一峰阅读学习
    ms转成00:00:00的时间格式化
    android侧滑效果,SlidingMenu配置
    Android Developers:按需求加载视图
    Python测试代理ip是否有效
    JavaScript去除数组中重复的数字
    Python连接redis
    [已解决]报错: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
  • 原文地址:https://www.cnblogs.com/sun2020/p/13959824.html
Copyright © 2020-2023  润新知