zoukankan      html  css  js  c++  java
  • 自定义注解使用

    1.自定义注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface FieldConstraints {
    
        /**
         * 字段长度判断.
         * @return 返回限制长度.
         */
        int limitLen() default 50;
    
        /**
         * 是否必填判断.
         * @return 限制是否为空.
         */
        boolean isNotBlank() default false;
    
        /**
         * 是否必填判断.
         * @return 限制是否为空.
         */
        boolean isNotNull() default false;
    
        /**
         * @return
         */
        /* 规则校验类. */
        Class ruleValidate() default NoSuchValidateRule.class;
    
    }

    2.引入自定义注解

    @Setter
    @Getter
    @ToString
    public class RuleVo {
    
        /**
         * 调用测系统来源.
         */
        @FieldConstraints(limitLen = 50,isNotBlank = true,ruleValidate = IdSoaValidateRule.class)
        private String systemId;
    
        /**
         * 调用方
         */
        @FieldConstraints(limitLen = 50,isNotBlank = true)
        private String appKey;
    
        /**
         * 调用方
         */
        @FieldConstraints(limitLen = 50,isNotBlank = true, ruleValidate = CorValidateRule.class )
        private String pin;
    
        @FieldConstraints(limitLen = 5000,isNotBlank = true)
        private String mobile;
    
        @FieldConstraints(limitLen = 20,isNotBlank = true, ruleValidate = kuValidateRule.class)
        private String sku;
    
        /**
         * 用户的ip地址.
         */
        @FieldConstraints(limitLen = 30,isNotBlank = true)
        private String userIp;
    }

    3.传入对象根据注解校验

    public <T>  void validateFieldInfo(T t) throws ParamErrorException {
            if (null == t) {
                throw new ParamErrorException("校验参数(validateFieldInfo)参数为空.");
            }
            Field[] fields = t.getClass().getDeclaredFields();
            if (null == fields) {
                log.error("校验参数(validateFieldInfo)请求实体参数为空.");
                throw new ParamErrorException("校验参数(validateFieldInfo)请求实体参数为空.");
            }
            for (Field field : fields) {
                field.setAccessible(true);
                try {
                    boolean ruleFlag = field.isAnnotationPresent(FieldConstraints.class);
                    if (ruleFlag) {
                        FieldConstraints fieldRule = field.getAnnotation(FieldConstraints.class);
                        //本来是注解必填才可以处理下边的规则,但是有些情况是可以不填,但是填了必须填正确.
    //                    if (!fieldRule.isBlank()) {
    //                        continue;
    //                    }
                        // 如果类型是String  如果type是类类型,则前面包含"class ",后面跟类名
                        if (field.getGenericType().toString().equals("class java.lang.String")) {
                            fetchStringField(field, fieldRule, t);
                        } else {
                            log.warn("入参属性值" + field.getName() + "未被处理.");
                        }
                    }else{
                        log.debug("入参属性值" + field.getName() + "未被处理.");
                    }
                } catch (Exception ex) {
                    log.error("处理入参属性为:{}异常!{}", new Object[]{field.getName(), ex.getMessage()});
                    throw new ParamErrorException("入参属性值" + field.getName() + "校验异常."+ex.getMessage(), ex);
                }
            }
        }
        private <T> void fetchStringField(Field field, FieldConstraints fieldRule, T t) throws Exception {
                String value = (String) field.get(t);
                if (fieldRule.isNotBlank() && StringUtil.isBlank(value)) {
                    throw new ParamErrorException("入参属性值" + field.getName() + "不能为空.");
                }
                if (fieldRule.isNotNull() && null == value) {
                    throw new ParamErrorException("入参属性值" + field.getName() + "不能为空.");
                }
                if ((fieldRule.isNotBlank() || fieldRule.isNotNull()) && value.length() > fieldRule.limitLen()) {
                    throw new ParamErrorException("入参属性值" + field.getName() + "长度超限.value:" + value);
                }
                if (fieldRule.ruleValidate().getName().endsWith(NoSuchValidateRule.class.getName())) {
                    return;
                }
                ValidateRule validateRule = (ValidateRule) SpringContextHolder.getBean(fieldRule.ruleValidate());
                validateRule.validateTByRule(value);
        }
  • 相关阅读:
    Python学习
    shell 脚本收藏
    无限级分类接口
    php 过滤多维数组中值为空的字段
    逆波兰表达式3(后缀表达式求值)
    [数据结构]之队列
    最大公约数和最小公倍数
    暗时间阅读笔记
    android判断文件是否是图片文件的方法
    android从assets读取文件的方法
  • 原文地址:https://www.cnblogs.com/PengChengLi/p/11052715.html
Copyright © 2011-2022 走看看