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