【建議使用】告別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
)
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部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2848466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Vue】元件使用之引數校驗Vue元件
- 引數校驗註解
- 介面測試-引數校驗
- Spring Boot 引數校驗Spring Boot
- fastapi 請求引數 校驗ASTAPI
- 基礎設施建設——全域性請求引數校驗
- 實現Nest中引數的聯合型別校驗型別
- C# .net framework .net core 3.1 請求引數校驗, DataAnnotations, 自定義引數校驗C#Framework
- 使用Spring Validation優雅地校驗引數Spring
- Springboot引數校驗--最全Spring Boot
- SpringMVC實現引數校驗SpringMVC
- Hutool—好用的 Java 工具類庫Java
- Flask開發技巧之引數校驗Flask
- Spring WebFlux 基礎教程:引數校驗SpringWebUX
- 【深度思考】如何優雅的校驗引數?
- 元件引數校驗與非props特性元件
- Struts2中請求引數校驗
- java獲取url連線地址引數的工具類Java
- Java SpringBoot上的引數校驗JSR 303 ValidationJavaSpring BootJS
- Oracle RAC一鍵部署004(RAC引數校驗)Oracle
- 一個輕量級的引數校驗框架框架
- @Validated、@Valid在service層引數校驗
- 自媒體中有哪些好用的工具網站?建議收藏網站
- 如何在專案中優雅的校驗引數
- Spring Boot實現通用的介面引數校驗Spring Boot
- 好用的資料校驗&修復工具gt-checksum開源啦
- 【建議收藏】好用的API大全API
- Java™ 教程(有界型別引數)Java型別
- java語言邏輯類、引數類和字元類Java字元
- Python中最好用的命令列引數解析工具Python命令列
- SpringBoot如何優雅的進行引數校驗Spring Boot
- 放置類AR體驗框架和設計建議 (上篇)框架
- 放置類AR體驗框架和設計建議 (下篇)框架
- ThinkPHP 類似 AOP 思想的引數驗證PHP
- drf——Request原始碼分析、序列化元件、序列化類的使用(欄位類和引數)、反序列化校驗和儲存原始碼元件
- 【超實用攻略】SpringBoot + validator 輕鬆實現全註解式的引數校驗Spring Boot
- 推薦一款好用的資料一致性校驗工具
- 好用的IdCardNumberMethod工具類(直接複製使用)