這篇文章主要講解了spring boot中進(jìn)行參數(shù)校驗(yàn)的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)蕭山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
上文我們討論了spring-boot如何去獲取前端傳遞過來的參數(shù),那傳遞過來總不能直接使用,需要對(duì)這些參數(shù)進(jìn)行校驗(yàn),符合程序的要求才會(huì)進(jìn)行下一步的處理,所以本篇文章我們主要討論spring-boot中如何進(jìn)行參數(shù)校驗(yàn)。
lombok使用介紹
在介紹參數(shù)校驗(yàn)之前,先來了解一下lombok的使用,因?yàn)樵诮酉聛淼膶?shí)例中或有不少的對(duì)象創(chuàng)建,但是又不想寫那么多的getter和setter,所以先介紹一下這個(gè)很強(qiáng)大的工具的使用。
Lombok 是一個(gè)可以通過簡(jiǎn)單的注解形式來幫助我們簡(jiǎn)化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對(duì)應(yīng)的注解,可以在編譯源碼的時(shí)候生成對(duì)應(yīng)的方法。
添加maven依賴
在pom文件中添加如下內(nèi)容:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency>
基礎(chǔ)注解
@Getter
給類增加get方法
@Setter
給類增加set方法
@Builder
給類增加構(gòu)建者模式
@AllArgsConstructor
給類增加全參構(gòu)造方法
@NoArgsConstructor
給類增加無參數(shù)構(gòu)造方法
@RequiredArgsConstructor
按照必填屬性增加構(gòu)造方法
@NonNull
變量值不能為空
這里只簡(jiǎn)單列一下常用注解的含義,具體的使用方式在參數(shù)校驗(yàn)的實(shí)例中體現(xiàn)。
實(shí)戰(zhàn)
上篇文章中我們用BannerCreateDto這個(gè)對(duì)象了來接收前端傳遞的參數(shù),那時(shí)是手動(dòng)添加的get和set方法,這里我們用lombok注解來簡(jiǎn)化掉之前的樣板代碼:
@Setter @Getter public class BannerCreateDto { private String name; private Integer pos; }
接口的定義還是和之前一樣。不同做任何修改:
@PostMapping(value = "/create") public Map<String, Object> createBanner(@RequestBody BannerCreateDto dto){ Map<String, Object> res = new HashMap<>(); res.put("id", 10000); res.put("name", dto.getName()); res.put("pos", dto.getPos()); return res; }
重新運(yùn)行程序,訪問接口
還是和之前一樣,能夠請(qǐng)求成功并正常的返回?cái)?shù)據(jù)。
一般情況下,我們會(huì)針對(duì)返回的數(shù)據(jù),來單獨(dú)定義對(duì)象來進(jìn)行描述,這里我們也定義一個(gè)
@Builder @Getter public class BannerResponseDto { private int id; private String name; private Integer pos; }
這里用到了@Builder、@Getter,在接口中構(gòu)造對(duì)象并返回:
@PostMapping(value = "/create") public BannerResponseDto createBanner(@RequestBody BannerCreateDto dto){ return BannerResponseDto.builder() .id(500) .name(dto.getName()) .pos(dto.getPos()) .build(); }
可以看到lombok的@Builder注解,能夠讓類通過構(gòu)建者模式去創(chuàng)建對(duì)象,省去了大量的set代碼,而且可讀性也很好。
訪問接口,看看數(shù)據(jù)返回的時(shí)候正常:
與之前是一樣的,能夠正常返回?cái)?shù)據(jù),那接下來我們就正式看一下,spring-boot如何進(jìn)行參數(shù)校驗(yàn)了。
參數(shù)校驗(yàn)
參數(shù)校驗(yàn)就是說對(duì)前端傳過來的數(shù)據(jù)進(jìn)行合理性校驗(yàn),看他能否滿足我們的業(yè)務(wù)規(guī)則,那這些對(duì)參數(shù)進(jìn)行校驗(yàn)的代碼是該放在那里呢,是在Controller里還是說單獨(dú)存放,又獲取采用其他什么方式呢?
參數(shù)校驗(yàn)該怎么做
首先要明確的一點(diǎn),在Controller,不應(yīng)該有大量邏輯判斷的代碼,為什么呢,我們可想想當(dāng)參數(shù)較多的時(shí)候,對(duì)每個(gè)參數(shù)進(jìn)行合理性校驗(yàn)的話,那代碼量該有多少,那就會(huì)嚴(yán)重污染Controller,導(dǎo)致維護(hù)起來是很艱難的,所以應(yīng)該要有一個(gè)合理的機(jī)制能把校驗(yàn)的代碼抽離出來,從而保證Controller的簡(jiǎn)潔性。
在java的世界里有這么個(gè)概念叫做 JSR,是Java Specification Requests的首字母縮寫,是編程語言Java規(guī)范請(qǐng)求或者說是Java語言的說明書,既然是說明書那就一定有各個(gè)版本,在JSR-303版本中,提出了Bean Validation的驗(yàn)證規(guī)范,目前主要有兩個(gè)兩個(gè)框架實(shí)現(xiàn)了Bean Validation規(guī)范,一個(gè)事自帶的javax.validation.api和hibernate-validator框架,而hibernate-validator框架應(yīng)用的更加廣泛一點(diǎn)。
那我們就用這種Bean Validation這種驗(yàn)證框架進(jìn)行參數(shù)的驗(yàn)證
實(shí)戰(zhàn)
@RestController @Validated public class BannerController { @GetMapping("/v3/banner") public Map<String, Object> getBannerDetailV2(@RequestParam Integer id, @RequestParam @Max(10) Integer pos){ Map<String, Object> body = new HashMap<>(); body.put("id", id); body.put("pos", pos); return body; } }
上面代碼中,@Max(10)注解來驗(yàn)證輸入?yún)?shù)的pos,限制其輸入?yún)?shù)最大值為10,運(yùn)行程序我們來測(cè)試一下:
訪問接口http://localhost:8081/v3/banner?id=12&pos=33后,看到我們控制臺(tái)的輸出提示輸入不能超過10,這里的這個(gè)message不是我寫的哈,這是java國際化后的效果能夠根據(jù)你所在地區(qū)決定顯示什么語言。
當(dāng)然這里我們也可以自定義錯(cuò)誤的message:
@GetMapping("/v3/banner") public Map<String, Object> getBannerDetailV2(@RequestParam Integer id, @RequestParam @Max(value = 10, message = "超過10了,趕緊看看哇") Integer pos){ Map<String, Object> body = new HashMap<>(); body.put("id", id); body.put("pos", pos); return body; }
還是上面的請(qǐng)求路徑,看看控制臺(tái)輸出:
可以看到控制臺(tái)輸出了我們自定義的內(nèi)容。這里有一點(diǎn)要注意,要想使得校驗(yàn)生效,比如在Controller上方打上@Validated注解,至于為什么我們后面分解。
上面的驗(yàn)證都是比較基礎(chǔ)的數(shù)據(jù)類型,但是如果現(xiàn)在要有驗(yàn)證更加復(fù)雜一點(diǎn)的java對(duì)象呢,又該如何操作,那接下來我們?cè)倏纯催@部分的內(nèi)容。
java對(duì)象進(jìn)行驗(yàn)證單個(gè)對(duì)象
還是用上面的BannerResponseDto來進(jìn)行演示
import org.hibernate.validator.constraints.Length; @Setter @Getter public class BannerCreateDto { @Length(min = 2, max = 4, message = "banner名稱必須是2-10個(gè)字符") private String name; private Integer pos; }
對(duì)于這些基礎(chǔ)類型的成員變量仍然使用這些基礎(chǔ)注解進(jìn)行校驗(yàn)定義,上面我們使用了 @Length注解來定義banner名稱的字符長度范圍,并定義發(fā)生錯(cuò)誤時(shí)提示的message,這里還需要在Controller里額外的處理一下:
@PostMapping("/v3/banner/create") public BannerResponseDto createBanner(@RequestBody @Validated BannerCreateDto dto){ return BannerResponseDto.builder() .id(500) .name(dto.getName()) .pos(dto.getPos()) .build(); }
@Validated BannerCreateDto這里必須要加@Validated注解,否則無法觸發(fā)校驗(yàn)機(jī)制。
嵌套
如果某個(gè)類的成員變量也是一個(gè)自定義對(duì)象,那校驗(yàn)該是什么樣的呢,下面我們來看一下。
先定義一個(gè)新的對(duì)象,用來接收banner到的素材信息
@Getter @Setter public class MaterialDto { @Length(min = 2, max = 5, message = "素材的名稱長度范圍必須在2-5之內(nèi)") private String name; }
然后banner對(duì)象增加一個(gè)成員變量
@Setter @Getter public class BannerCreateDto { @Length(min = 2, max = 4, message = "banner名稱必須是2-10個(gè)字符") private String name; private Integer pos; @Valid private MaterialDto materialDto; }
這里有一點(diǎn),要想使得這種級(jí)聯(lián)的關(guān)系能夠觸發(fā)校驗(yàn)機(jī)制,必須 @Valid注解進(jìn)行標(biāo)記,我們來請(qǐng)求一下url看看效果
可以看到校驗(yàn)沒通過,再看看控制臺(tái)輸出內(nèi)容:
輸出了我們定義的錯(cuò)誤信息。
看完上述內(nèi)容,是不是對(duì)spring boot中進(jìn)行參數(shù)校驗(yàn)的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:springboot中進(jìn)行參數(shù)校驗(yàn)的方法
URL分享:http://aaarwkj.com/article14/jjjdge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站、建站公司、微信小程序、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)