您的位置:  首页 > 技术 > java语言 > 正文

【建议使用】告别if,Java超好用参数校验工具类

2021-12-16 16:01 https://my.oschina.net/u/5079097/blog/5371735 PHP开发工程师 次阅读 条评论

一、前言

今天和小伙伴们分享一个常用的工具类,共计四个方法,使用场景比较广泛,有用于校验某个对象或对象中指定属性为空值时,直接返回异常,常用语校验前端请求参数;也有当值不为空时,执行指定动作,可减少大量的if条件,如:mybatis请求参数设置;还有用于判断当值不为空时,替代为新值,完成后续动作。

这样描述可能不够清晰,这里我列举了几个使用场景,更多的场景需要小伙伴们根据自己业务需求合理使用。

//场景一,点击登录时,后端校验用户名

if(StringUtils.isEmpty(name)){

    throw new Exception("登录用户名不能为空");

}



//场景二:属性内容转换为新值

String address = "浙江省杭州市";

if(StringUtils.isNotEmpty(address)){

    address ="地址:"+address;

}



//场景三:替代过多的if条件

SysUserDto userDto = new SysUserDto();//前端参数



SysUser user = new SysUser();//mybatis参数

if(StringUtils.isEmpty(userDto.getName())){

    user.setUserName(userDto.getName())

}

if(StringUtils.isEmpty(userDto.getPwd())){

    user.setPassword(userDto.getPwd())

}

复制代码

\

二、正文

首先创建一个测试实体类:

import lombok.Data;



@Data

public class SysUser{

    private String name;

    private String password;

}

复制代码

2.1 检查多个对象不能为空

  • 测试范例
SysUser user = new SysUser();

SysUser user2 = null;

Args.notEmptys(user,user2);

复制代码

  • 方法内容
public static void notEmptys(Object... objects) {

    for (Object obj : objects) {

        if (obj == null) {

            throw new BusinessException("属性不能为空");

        }

        if (obj.toString().trim().isEmpty()) {

            throw new BusinessException("属性不能为空");

        }

    }

}

复制代码

  • 测试结果
Exception in thread "main" 属性不能为空

    at com.basic.business.utils.Args.notEmptys(Args.java:27)

    at com.basic.business.demo.DemoController.main(DemoController.java:43)

复制代码

2.2 校验对象属性不能为空

若将参数【Boolean isAll】设置为true,则会校验全部属性;若设置为false,就需要将检测字段放入【propertys】中。

  • 测试范例
SysUser user = new SysUser();

//用法一:校验全部参数

Args.checkField(user,true,"");

//用法二:只校验password参数

Args.checkField(user,false,"password");

复制代码

  • 方法内容
/**

  * 对象多字段判空检查 

  * @param obj       被检查的对象

  * @param isAll 是否检查全部参数

  * @param propertys 被检查对象中的字段 可多个

  */

public static void checkField(Object obj, Boolean isAll, String... propertys) {

    if (obj != null) {

        Class<? extends Object> clazz = obj.getClass();

        

        if (isAll) {

            PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(clazz);

            for (int p = 0; p < propertyDescriptors.length; p++) {

                checkEachField(obj, propertyDescriptors[p]);

            }

        } else {

            if (propertys != null && propertys.length > 0) {

                //遍历所有属性

                for (int i = 0; i < propertys.length; i++) {

                    String property = propertys[i];

                    //获取属性信息

                    BeanUtils.getPropertyDescriptors(clazz);

                    PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(clazz, property);

                    checkEachField(obj, pd);

                }

            }

        }

    }

}



private static void checkEachField(Object obj, PropertyDescriptor pd) {

        Class<? extends Object> clazz = obj.getClass();

        String property = pd.getName();

        if (pd != null) {

            //获取当前字段的javabean读方法

            Method readMethod = pd.getReadMethod();

            if (readMethod != null) {



                Object invoke = null;

                try {

                    invoke = readMethod.invoke(obj);

                } catch (Exception e) {

                    throw new BusinessException("方法 " + readMethod.getName() + "无法执行");

                }



                if (invoke != null) {

                    //String类型单独处理

                    Class<?> propertyType = pd.getPropertyType();

                    if ("java.lang.String".equals(propertyType.getName())) {

                        if (StringUtils.isBlank((String) invoke)) {

                            throw new BusinessException("错误 : [ " + property + " ] 不能为空!");

                        }

                    } else if ("java.util.List".equals(propertyType.getName())) {

                        List list = (List) invoke;

                        if (list.size() == 0) {

                            throw new BusinessException("错误 : [ " + property + " ] 不能为空!");

                        }

                    }

                } else {

                    throw new BusinessException("错误 : [ " + property + " ] 不能为空!");

                }

            } else {

                throw new BusinessException("在 " + clazz + "中 找不到" + "[ " + property + " ] 的 读方法");

            }

        } else {

            throw new BusinessException("在 " + clazz + "中 找不到" + "[ " + property + " ] 属性");

        }

    }

复制代码

  • 测试结果
用法一结果:

Exception in thread "main" 错误 : [ name ] 不能为空!

at com.basic.business.utils.Args.checkEachField(Args.java:116)

at com.basic.business.utils.Args.checkField(Args.java:77)

    

用法二结果:

Exception in thread "main" 错误 : [ password ] 不能为空!

at com.basic.business.utils.Args.checkEachField(Args.java:116)

at com.basic.business.utils.Args.checkField(Args.java:77)

复制代码

2.3 参数不为空时执行指定动作

我们经常会遇到这种场景,根据前端参数来组装数据库查询条件,如果不为空我们就将前端值设置到是实体类中,或者如下面这个例子中,当name不为空时,加入到list当中。

  • 测试范例
List list = Lists.newArrayList();



SysUser user = new SysUser();

user.setName("huage");

Args.doIfNotEmpty(user.getName(),list::add);

System.out.println(list);

复制代码

  • 方法内容
public static <R, T> R doIfNotNull(T t, Callback<T, R> callback) {

    try {

        return t == null ? null : callback.call(t);

    } catch (Exception e) {

        throw new BusinessException("[doIfNotNull error]", e);

    }

}

复制代码

  • 测试结果
[huage]

复制代码

2.4 参数为空时使用新值,并完成指定动作

本方法和2.较为类似,只是当目标值不为空时,使用新值进行后续的操作,如下面这个例子中,name初始值为【test】,执行完doIfNotNullNewValue后会将新值【huage】添加到list中,。

  • 测试范例
 List list = Lists.newArrayList();



SysUser user = new SysUser();

user.setName("test");

Args.doIfNotNullNewValue(user.getName(),"huage",list::add);

System.out.println(list);

复制代码

  • 方法内容
public static <R, T> R doIfNotNullNewValue(T t,T newt, Callback<T, R> callback) {

    try {

        return t == null ? null : callback.call(newt);

    } catch (Exception e) {

        throw new BusinessException("[doIfNotNull error]", e);

    }

}

复制代码

  • 测试结果
[huage]

最后

如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:https://gitee.com/ZhongBangKeJi/crmeb_java不胜感激 !

 

  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接