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);
        }
  • 相关阅读:
    c++回调java方法
    c++ 11学习笔记--智能指针
    c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)
    explicit构造函数和private
    c++ 11学习笔记--右值引用和移动构造语义
    c++ 11学习笔记-- 常量表达式(constexpr)
    从京东app学到的(1)
    从文轩商城app学到的
    AntV G2 toolTip 自定义显示
    Ant Design of Vue table表格 点击一行选中效果
  • 原文地址:https://www.cnblogs.com/PengChengLi/p/11052715.html
Copyright © 2011-2022 走看看