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

195 篇文章 2 订阅
149 篇文章 2 订阅

一、前言

今天和小伙伴们分享一个常用的工具类,共计四个方法,使用场景比较广泛,有用于校验某个对象或对象中指定属性为空值时,直接返回异常,常用语校验前端请求参数;也有当值不为空时,执行指定动作,可减少大量的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]

java学习上遇到问题该如何解决?石墨文档是一款轻便、简洁的在线协作文档工具,PC端和移动端全覆盖,支持多人同时对文档编辑和评论,让你与他人轻松完成协作撰稿、方案讨论、会议记录和资料共享等工作。https://shimo.im/docs/PrtyKWjqkqppjQPg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值