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

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

作者: 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