美文网首页
表单提交参数数据校验的一种实现方式

表单提交参数数据校验的一种实现方式

作者: TMAC_EAH | 来源:发表于2020-09-07 16:55 被阅读0次

    项目中提交功能中或多或少会使用到非空校验,一个两个参数还好,如果很多咋办?老实说,一般来写又臭又长.除了非空还有非0校验呢~在下手头项目中遇到参数校验不下100个,写哭了...

    1.0写法,activity/fragment构造请求体

           if (TextUtils.isEmpty(testname)) {
                ToastUtil.showShort(mContext, "试验名称不能为空");
                return;
            }
            if (mMapperResp == null) {
                ToastUtil.showShort(mContext, "试验负责人不能为空");
                return;
            }
            if (mBaseSelcFuncBean == null) {
                ToastUtil.showShort(mContext, "试验类型不能为空");
                return;
            }
            if (cropId == 0) {
                ToastUtil.showShort(mContext, "作物类别不能为空");
                return;
            }
            if (varietiesId == 0) {
                ToastUtil.showShort(mContext, 作物品种不能为空");
                return;
            }
          json.testName = 试验名称;
          json.a = 试验负责人;
          json.b = 实验类型;
          json.c = 作物类别;
          json.d = 作物品种;
          IHtmlHttpRequestImpl.execPost(json, new SafeHttpCallbackAdapt<String>(iLoading, 
          getActivity()) {};// 发起网络请求
    

    这样写很丑很臭很长,不知道您发现没有~

    2.0写法activity/fragment构造请求体

    public class IException extends RuntimeException {
        public IException(String message) {
            super(message);
        }
    }
    --->>submit--->>
         try {
                json.testName = 试验名称;
                json.a = 试验负责人;
                json.b = 实验类型;
                json.c = 作物类别;
                json.d = 作物品种;
                json.check();
                IHtmlHttpRequestImpl.execPost(json, new SafeHttpCallbackAdapt<String>(iLoading,
                        getActivity()) {};// 发起网络请求
            } catch (Exception e) {
                e.printStackTrace();
                if(e instanceof IException){
                    ToastUtil.showShort(mContext, e.getMessage());
                }
            }
    --->>check--->>校验逻辑封装,外包出去,activity/fragment清爽不少,当然逻辑还是没有少啦.
      public void check(){
            if (cropId == 0) {
                throw new IException("作物类别不能为空");
            }
            if (varietiesId == 0) {
                throw new IException("作物品种不能为空");
            }
            if (Tools.isEmpty(cropArea)) {
                throw new IException("作物面积不能为空,输入0到9个9,保留两位小数");
            }
            if (Tools.isEmpty(age)) {
                throw new IException("树龄不能为空");
            }
            if (Tools.isEmpty(soil)) {
                throw new IException("土壤质地不能为空");
            }
      }
    

    3.0写法activity/fragment构造请求体 使用注解,给字段加限制

    1.构建注解
    @Inherited
    @Documented
    @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface CheckAdapt {
        /**
         * 检测类型
         */
        int checkType() default ParamCheckType.EMPTY_CHECK;
    
        /**
         * 检测排位,第一个参数就赋值1 第二个参数就赋值2 按顺序判断 非空,非零
         *
         * @return
         */
        int checkRank() default ParamCheckType.EMPTY_CHECK;
    
        /**
         * 参数名字
         *
         * @return
         */
        String paramsName();
    }
    
    2.弄个接口耍
    public interface IParseAdapt<T> {
        void parse(T t);
    }
    3.核心代码实现(注解字段除了list其它用object接收就好啦,干嘛分那么细,老实说,我是在测试哈哈哈)
    public class IParseAdaptImpl<T> implements IParseAdapt<T>, ParamCheckType {
    
        @Override
        public void parse(T target) {
            long startTime = System.currentTimeMillis();
            Field[] allFields = getAllFields(target);
            TreeMap<Integer, Field> hash = new TreeMap<>();
            if (allFields.length > 0) {
                for (Field field : allFields) {
                    field.setAccessible(true);
                    if (field.isAnnotationPresent(CheckAdapt.class)) {
                        CheckAdapt mCheckAdapt = field.getAnnotation(CheckAdapt.class);
                        if (mCheckAdapt != null) {
                            hash.put(mCheckAdapt.checkRank(), field);
                        }
                    }
                }
            }
            for (Map.Entry<Integer, Field> entrys : hash.entrySet()) {
                Field mField = entrys.getValue();
                try {
                    Class<?> mType = mField.getType();
                    CheckAdapt mCheckAdapt = mField.getAnnotation(CheckAdapt.class);
                    if (mType == List.class) {
                        List list = (List) mField.get(target);
                        //DeepCheck
                        if (list == null || list.isEmpty()) {
                            parse(mCheckAdapt, "");
                        } else {
                            for (Object item : list) {
                                if (item instanceof DeepCheck) {
                                    DeepCheck mDeepCheck = (DeepCheck) item;
                                    switch (mDeepCheck.getType()) {
                                        default:
                                            try {
                                                if (Tools.isEmpty(mDeepCheck.text())) {
                                                    throw new IException(mDeepCheck.getTypeValues()[mDeepCheck.getType()] + NO_EMPTY);
                                                }
                                            } catch (IndexOutOfBoundsException e) {
                                                e.printStackTrace();
                                            } catch (NullPointerException e) {
                                                e.printStackTrace();
                                            }
                                            break;
                                    }
                                }
                            }
                        }
                        LogUtils.e("校验", "=list:" + list);
                    } else if (mType == String.class) {
                        String list = (String) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=String:" + list);
                    } else if (mType == Long.class || mType == long.class) {
                        Long list = (Long) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Long:" + list);
                    } else if (mType == Short.class || mType == short.class) {
                        Short list = (Short) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Short:" + list);
                    } else if (mType == Byte.class || mType == byte.class) {
                        Byte list = (Byte) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Byte:" + list);
                    } else if (mType == Double.class || mType == double.class) {
                        Double list = (Double) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Double:" + list);
                    } else if (mType == Boolean.class || mType == boolean.class) {
                        Boolean list = (Boolean) mField.get(target);
                        String result;
                        if (list == null || list) {
                            result = "";
                        } else {
                            result = list.toString();
                        }
                        parse(mCheckAdapt, result);
                        LogUtils.e("校验", "=Boolean:" + list);
                    } else if (mType == Float.class || mType == float.class) {
                        Float list = (Float) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Float:" + list);
                    } else if (mType == Character.class || mType == char.class) {
                        Character list = (Character) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Character:" + list);
                    } else if (mType == Integer.class || mType == int.class) {
                        Integer list = (Integer) mField.get(target);
                        parse(mCheckAdapt, list);
                        LogUtils.e("校验", "=Integer:" + list);
                    } else {
                        boolean array = mField.getType().isArray();
                        if (array) {
                        }
                        LogUtils.e("校验", "=是数组吗:" + array);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    LogUtils.e("校验", "=异常啦:" + e);
                }
    //            } catch (Exception e) {
    //                e.printStackTrace();
    //                LogUtils.e("校验", "=异常啦:" + e);
    //            }
            }
            long endTime = System.currentTimeMillis();
            LogUtils.e("校验", "=================>程序运行时间:" + (endTime - startTime) + "毫秒");
        }
    
        public void parse(CheckAdapt mCheckAdapt, Object target) {
            LogUtils.e("校验", "===目标====[" + target + "]");
            String list = "" + (target == null ? "" : target.toString());
            LogUtils.e("校验", "===目标转换====[" + list + "]");
            switch (mCheckAdapt.checkType()) {
                case ParamCheckType.EMPTY_CHECK:
                    if (Tools.isEmpty(list)) {
                        throw new IException(mCheckAdapt.paramsName() + NO_EMPTY);
                    }
                    break;
                case ParamCheckType.ZERO_CHECK:
                    if (!Tools.isEmpty(list)) {
                        try {
                            Double aDouble = Double.valueOf(list);
                            if (aDouble <= ZERO) {
                                throw new IException(mCheckAdapt.paramsName() + NO_ZERO);
                            }
                        } catch (NumberFormatException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case ParamCheckType.EMPTY_AND_ZERO_CHECK:
                    if (Tools.isEmpty(list)) {
                        throw new IException(mCheckAdapt.paramsName() + NO_EMPTY);
                    }
                    try {
                        Double aDouble = Double.valueOf(list);
                        if (aDouble <= ZERO) {
                            throw new IException(mCheckAdapt.paramsName() + NO_ZERO);
                        }
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    
        public static Field[] getAllFields(Object object) {
            if (object == null) {
                Field[] fields = new Field[]{};
                return fields;
            }
            Class clazz = object.getClass();
            List<Field> fieldList = new ArrayList<>();
            Field[] declaredFields = clazz.getDeclaredFields();
            List<Field> temps = new ArrayList<>();
            for (Field field : declaredFields) {
                temps.add(field);
            }
            fieldList.addAll(temps);
            while (clazz != null) {
                fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
                clazz = clazz.getSuperclass();
            }
            Field[] fields = new Field[fieldList.size()];
            fieldList.toArray(fields);
            return fields;
        }
    }
    
    
    
        public static class Tst {
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "树龄", checkRank = 1)
            public int x = 2;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "作物面积", checkRank = 3)
            public String y;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "行距", checkRank = 2)
            public Long z = 06l;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "株距", checkRank = 4)
            public Short a;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "有机质", checkRank = 5)
            public Byte b;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "fe", checkRank = 6)
            public char c;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "zn", checkRank = 7)
            public double d;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "b", checkRank = 8)
            public float e;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "si", checkRank = 9)
            public boolean f;
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "ca", checkRank = 10)
            public List<String> list = new ArrayList<>();
            @CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "mg", checkRank = 11)
            public List<Deep> mgs = new ArrayList<>();
        }
    4.所需其它类
    public interface ParamCheckType {
        /**
         * 非空校验
         */
        int EMPTY_CHECK = 0;
        /**
         * 非空+非0校验
         */
        int EMPTY_AND_ZERO_CHECK = 1;
        /**
         * 非零检测校验
         */
        int ZERO_CHECK = 2;
    
        String NO_EMPTY = "不能为空";
        String NO_ZERO = "不能为0";
        int ZERO = 0;
    }
    }
        public static class Deep implements DeepCheck {
            public int type;
    
            @Override
            public int getType() {
                return type;
            }
    
            @Override
            public String text() {
                return "";
            }
    
            public Deep(int type) {
                this.type = type;
            }
    
            @Override
            public String[] getTypeValues() {
                return new String[]{"key1", "key2", "key3"};
            }
        }
    public class Tools{
        public static final String NULL_VALUE = "null";
    
        /**
         * 非空判断
         */
        public static boolean isEmpty(CharSequence str) {
            if ((str + "").equalsIgnoreCase(NULL_VALUE)) {
                return true;
            }
            return isEmptys(str);
        }
    
        public static boolean isEmptys(CharSequence str) {
            return str == null || str.length() == 0;
        }
    }
    /**
     * 深检测
     */
    public interface DeepCheck {
        int getType();
        String text();
        String[] getTypeValues();
    }
    

    调用示例(非零,非空,非零加非空校验)

    {
            try {
                Tst tst = new Tst();
                new IParseAdaptImpl().parse(tst); // 校验核心逻辑
                //        发起http请求
            } catch (Exception e) {
                e.printStackTrace();
                if (e instanceof IException) {
                    ToastUtil.debug(e.getMessage());
                }
            }
    }
    // 测试用例,期望结果
    http.ex.IException: 作物面积不能为空
        at http.tag.IParseAdaptImpl.parse(IParseAdaptImpl.java:167)
        at http.tag.IParseAdaptImpl.parse(IParseAdaptImpl.java:84)
    
    

    相关文章

      网友评论

          本文标题:表单提交参数数据校验的一种实现方式

          本文链接:https://www.haomeiwen.com/subject/rynkektx.html