zoukankan      html  css  js  c++  java
  • 自定义校验注解

    需求原型是

    许多接口都需要 userId 作为参数,参与接口的调用,但是很多情况下,传入不存在的userId 到数据库,会产生脏数据,因此需要在接口接收userId 的时候校验用户表是否存在此 userId

    第一步:自定义注解 CheckUser

    @Target({ElementType.PARAMETER,ElementType.FIELD,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = CheckUserImpl.class)
    public @interface CheckUser {
    
        /**
         * 是否允许为空
         *
         * @return
         */
        boolean allowNull() default false;
    
        /**
         * 是否需要校验(如果单纯只是想作为swagger提示展示的时候就设置为false)
         *
         * @return
         */
        boolean doValid() default true;
    
        /**
         * 提示信息
         *
         * @return
         */
        String message() default "用户id不存在";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        /**
         * 是否隐藏参数
         *
         * @return
         */
        boolean hideDescription() default false;
    }

    第二步:编写注解的实现类 CheckUserImpl

    @Slf4j
    @Aspect
    @Component
    public class CheckUserImpl implements ConstraintValidator<CheckUser,Long> {
    
        private CheckUser constraintAnnotation;
        @Autowired
        private ValidateDao validDao;
    
    
        @Override
        public boolean isValid(Long value, ConstraintValidatorContext context) {
            if (value == null || value == 0) {
                return constraintAnnotation.allowNull();
            }
            boolean doValid = this.constraintAnnotation.doValid();
            if (!doValid) {
                return true;
            }
            Integer result = validDao.validUserId(value);
            if(result >0){
                return true;
            }
            return false;
        }
    
        @Override
        public void initialize(CheckUser constraintAnnotation) {
            this.constraintAnnotation = constraintAnnotation;
        }
    }

    在实现类中,ValidateDao 为 mybatis 提供的接口

    第三步:在参数处指定需要校验的 UserId

  • 相关阅读:
    D触发器的使用小结
    CAN通信帧ID的含义解析? (转载)
    mcp2515屏蔽寄存器和过滤寄存器的学习
    spi调试步骤,mcp2515调试整理
    最近工作小结2019.11.24
    Can总线上的电平及物理层仲裁
    can总线学习网上资料汇总
    can总线的远程帧(遥控帧)—说的很形象
    在IAR平台建立STC8ASK64S4A12单片机工程
    cortex-m系列的区别(图解)及今日碎片学习笔记
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/14063235.html
Copyright © 2011-2022 走看看