java反射机制判断前端表单提交数据是否可以为空

前言:后端编写接口,供前端调用,前端已将表单进行验证(判空),后端也要对接收的数据进行验证(是否可以为空)

1:编写公共类

首先编写方法:此方法需要传递2个参数,第一的参数是一个对象(此对象储存前端传递的数据),第二个参数是此接口必填的字段名(多个逗号分隔),进方法后先执行model_isNoll()方法,先看下此方法!下方

    /**
     * 验证是否含有全部必填字段
     * classModel 实体类 ,requiredColumns为必须要传的字段
     *
     * @param requiredColumns 必填的参数字段名称 逗号隔开 比如"userId,name,telephone"
     */
    public static void  hasAllRequired(Object classModel, String requiredColumns) {
        Map<String, Object> map = model_isNoll(classModel);
        if (!FormatEmpty.isEmpty(requiredColumns)) {
            //验证字段非空
            String[] columns = requiredColumns.split(",");
            for (String column : columns) {
                if (map.containsKey(column.trim())) {
                    if(FormatEmpty.isEmpty(map.get(column))){
                        throw new ApiException(column+" 值不能为空");
                    }
                }
            }
        } else {
            throw new ApiException("判空的字段不能为空");
        }
    }

下3方法主要是利用反射机制获取传入对象的属性名,然后通过属性名获取属性值,最后将对应的属性名及属性值放在map中

    /**
     * 把当前实体类的属性及值放在map中
     */
    public static Map<String, Object> model_isNoll(Object classModel) {
        String[] fieldNames = getFiledName(classModel);
        Map<String, Object> companyWantMap = new HashMap<>();
        for (int j = 0; j < fieldNames.length; j++) {     //遍历所有属性
            String name = fieldNames[j];    //获取属性的名字
            Object value = getFieldValueByName(name, classModel);
            if (value == null) {
                value = "";
            }
            companyWantMap.put(name, value);
        }
        return companyWantMap;
    }

    /**
     * 获取属性名数组
     */
    private static String[] getFiledName(Object o) {
        Field[] fields = o.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            fieldNames[i] = fields[i].getName();
        }
        return fieldNames;
    }

    /**
     * 根据属性名获取属性值
     */
    private static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(o, new Object[]{});
            return value;
        } catch (Exception e) {
            return null;
        }
    }

现在回到第一个方法,可以看到,通过后3方法可以获取对象中对应的属性名及属性值;遍历不能为空的字段,通过containskey()查找map对应的key值,假设找到对应的key时,判断value是否为空,空时给与异常反馈

public class ApiException extends RuntimeException
{
    private static final long serialVersionUID = 1L;

    protected final String message;

    public ApiException(String message)
    {
        this.message = message;
    }

    public ApiException(String message, Throwable e)
    {
        super(message, e);
        this.message = message;
    }

    @Override
    public String getMessage()
    {
        return message;
    }
}

2:调用

    @PostMapping("/adds")
    @ResponseBody
    public void adds(Bxy_Classification model) {
        Model_IsUtil.hasAllRequired(model,"name");
        bxy_ClassificationService.insertBxy_Classification(model);
    }

调用hasAllRequired()方法,假设未传递name值时的异常提示

{
    "msg":"name 值不能为空",
    "code":4001
}

参考:https://blog.csdn.net/weixin_43844810/article/details/90762425

https://www.cnblogs.com/JackZed/p/6888668.html

https://www.cnblogs.com/cuixiaomeng/p/10288504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值