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