关于java:建议使用告别ifJava超好用参数校验工具类

1次阅读

共计 4725 个字符,预计需要花费 12 分钟才能阅读完成。

一、前言
明天和小伙伴们分享一个罕用的工具类,共计四个办法,应用场景比拟宽泛,有用于校验某个对象或对象中指定属性为空值时,间接返回异样,常用语校验前端申请参数;也有当值不为空时,执行指定动作,可缩小大量的 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]

正文完
 0