ITPub博客

首页 > 应用开发 > Java > 【建议使用】告别if,Java超好用参数校验工具类

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

Java 作者:喝水会长肉 时间:2021-12-19 15:16:16 0 删除 编辑

一、前言

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

//vx耗:mbz_java_panlong 十年开发经验程序员,免费解答,备注“MI”即可
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]




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010294/viewspace-2848466/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-11-19

  • 博文量
    199
  • 访问量
    86386