首页 > 应用开发 > Java > 【建议使用】告别if,Java超好用参数校验工具类
今天和小伙伴们分享一个常用的工具类,共计四个方法,使用场景比较广泛,有用于校验某个对象或对象中指定属性为空值时,直接返回异常,常用语校验前端请求参数;也有当值不为空时,执行指定动作,可减少大量的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
)
若将参数【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
)
我们经常会遇到这种场景,根据前端参数来组装数据库查询条件,如果不为空我们就将前端值设置到是实体类中,或者如下面这个例子中,当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/ ,如需转载,请注明出处,否则将追究法律责任。