通常我們在編寫后端接口時,一般都需要對參數(shù)(請求數(shù)據(jù))進行校驗。參數(shù)校驗的重要性自然不必多說,先來看一下我們通常是如何進行參數(shù)校驗的?
StringaddUser(User user) {
// 參數(shù)校驗
if (user == null || user.getId() == null || user.getAccount() ==null || user.getPassword() == null || user.getEmail() == null) {
return "對象或者對象字段不能為空";
}
if (StringUtils.isEmpty(user.getAccount()) ||StringUtils.isEmpty(user.getPassword()) ||StringUtils.isEmpty(user.getEmail())) {
return"不能輸入空字符串";
}
if (user.getAccount().length() < 5 ||user.getAccount().length() > 10) {
return"賬號長度必須是5-10個字符";
}
if (user.getPassword().length() < 5 ||user.getPassword().length() > 10) {
return"密碼長度必須是5-10個字符";
}
if(!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$",user.getEmail())) {
return "郵箱格式不正確";
}
// 執(zhí)行業(yè)務(wù)邏輯
// do something
return "true";
}
如上所見,我們最常見的做法就是在業(yè)務(wù)層使用if-else進行校驗,這種做法在邏輯上沒有問題,同樣也能實現(xiàn)預(yù)期效果。但是這種做法過于繁瑣,在業(yè)務(wù)層包含了大量的校驗代碼,實在不夠優(yōu)雅,失去了可讀性以及美觀程度。
為了解決這些問題,我們可以使用SpringValidation來改進參數(shù)校驗方式。
首先,需要引入相關(guān)依賴:
引入依賴后我們就可以使用validation了,接下來看下具體使用方式:
1、為實體類的參數(shù)添加相應(yīng)注解
springvalidation可以很方便的制定校驗規(guī)則,并且能自動完成校驗。我們只要在需要校驗的字段上加入相關(guān)注解,同時可以指定校驗失敗的提示信息。
注:下面表格中列出一些常用校驗注解供參考。
注解 | 功能 |
@AssertFalse | 可以為null,如果不為null的話必須為false |
@AssertTrue | 可以為null,如果不為null的話必須為true |
@DecimalMax | 設(shè)置不能超過最大值 |
@DecimalMin | 設(shè)置不能超過最小值 |
@Digits | 設(shè)置必須是數(shù)字且數(shù)字整數(shù)的位數(shù)和小數(shù)的位數(shù)必須在指定范圍內(nèi) |
@Future | 日期必須在當前日期的未來 |
@Past | 日期必須在當前日期的過去 |
@Max | 最大不得超過此最大值 |
@Min | 最大不得小于此最小值 |
@NotNull | 不能為null,可以是空 |
@Null | 必須為null |
@Pattern | 必須滿足指定的正則表達式 |
@Size | 集合、數(shù)組、map等的size()值必須在指定范圍內(nèi) |
必須是email格式 | |
@Length | 長度必須在指定范圍內(nèi) |
@NotBlank | 字符串不能為null,字符串trim()后也不能等于“” |
@NotEmpty | 不能為null,集合、數(shù)組、map等size()不能為0;字符串trim()后可以等于“” |
@Range | 值必須在指定范圍內(nèi) |
@URL | 必須是一個URL |
2、在控制器層進行注解聲明
校驗規(guī)則和錯誤提示信息配置完畢后,只需要在控制器需要校驗的對象上加入@Valid注解即可。
3、統(tǒng)一異常處理
前兩步配置完成后,當傳入?yún)?shù)不滿足校驗規(guī)則時,程序就會拋出MethodArgumentNotValidException異常。我們通過spring統(tǒng)一異常處理,將該異常封裝成規(guī)范響應(yīng)格式。
測試效果:
我們故意傳入一個不符合規(guī)則的參數(shù),可以看到響應(yīng)已經(jīng)符合預(yù)期效果。
Springboot接口參數(shù)校驗方式改進為validation后,業(yè)務(wù)方法中只包含業(yè)務(wù)邏輯,代碼變得更加簡潔明了;同時降低了代碼耦合度,讓業(yè)務(wù)層只需關(guān)注業(yè)務(wù)邏輯,輕松構(gòu)建后端接口;并且validation提供了很多豐富的校驗規(guī)則,只需要加上注解即可使用,大家可以繼續(xù)查閱官方文檔了解。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/129984.html
摘要:方案一借助對方法級別數(shù)據(jù)校驗的能力首先必須明確一點此能力屬于框架的,而部分框架。 每篇一句 在金字塔塔尖的是實踐,學(xué)而不思則罔,思而不學(xué)則殆(現(xiàn)在很多編程框架都只是教你碎片化的實踐) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spr...
摘要:畢竟永遠相信本文能給你帶來意想不到的收獲使用示例關(guān)于數(shù)據(jù)校驗這一塊在中的使用案例,我相信但凡有點經(jīng)驗的程序員應(yīng)該沒有不會使用的,并且還不乏熟練的選手。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術(shù) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validati...
摘要:否則非法請求參數(shù)小則影響用戶體驗或者產(chǎn)生垃圾數(shù)據(jù),大則會拖跨整個系統(tǒng)其次,手工對所有的參數(shù)進行校驗相當繁瑣,容易出錯,而且最后,通過工具來完成其實是比較好的方式,但是必須讓工具變得優(yōu)雅一些。 聲明:本文屬原創(chuàng)文章,始發(fā)于公號:程序員自學(xué)之道,同步發(fā)布到 sf,轉(zhuǎn)載請注明出處。 不夠好的方案 在 Web 開發(fā)中, 我們經(jīng)常需要校驗各種參數(shù),這是一件繁瑣又重要的事情,對于很多人來說,在做參...
摘要:前言估計很多朋友都認為參數(shù)校驗是客戶端的職責,不關(guān)服務(wù)端的事。輕則導(dǎo)致服務(wù)器宕機,重則泄露數(shù)據(jù)。所以,這時就需要設(shè)置第二道關(guān)卡,服務(wù)端驗證了。老項目的服務(wù)端校驗不能為空不能為空看以上代碼,就一個的校驗就如此麻煩。 前言 估計很多朋友都認為參數(shù)校驗是客戶端的職責,不關(guān)服務(wù)端的事。其實這是錯誤的,學(xué)過 Web 安全的都知道,客戶端的驗證只是第一道關(guān)卡。它的參數(shù)驗證并不是安全的,一旦被有心人...
摘要:和上標注的約束都會被執(zhí)行注意如果子類覆蓋了父類的方法,那么子類和父類的約束都會被校驗。 每篇一句 沒有任何技術(shù)方案會是一種銀彈,任何東西都是有利弊的 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】Spring方法級別數(shù)據(jù)校...
閱讀 1459·2023-01-11 13:20
閱讀 1812·2023-01-11 13:20
閱讀 1263·2023-01-11 13:20
閱讀 2005·2023-01-11 13:20
閱讀 4226·2023-01-11 13:20
閱讀 2879·2023-01-11 13:20
閱讀 1487·2023-01-11 13:20
閱讀 3806·2023-01-11 13:20