亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

瀏覽:76日期:2023-09-05 18:13:31

上文我們討論了spring-boot如何去獲取前端傳遞過來的參數(shù),那傳遞過來總不能直接使用,需要對這些參數(shù)進(jìn)行校驗,符合程序的要求才會進(jìn)行下一步的處理,所以本篇文章我們主要討論spring-boot中如何進(jìn)行參數(shù)校驗。

lombok使用介紹

在介紹參數(shù)校驗之前,先來了解一下lombok的使用,因為在接下來的實(shí)例中或有不少的對象創(chuàng)建,但是又不想寫那么多的getter和setter,所以先介紹一下這個很強(qiáng)大的工具的使用。

Lombok 是一個可以通過簡單的注解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應(yīng)的注解,可以在編譯源碼的時候生成對應(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變量值不能為空

這里只簡單列一下常用注解的含義,具體的使用方式在參數(shù)校驗的實(shí)例中體現(xiàn)。

實(shí)戰(zhàn)

上篇文章中我們用BannerCreateDto這個對象了來接收前端傳遞的參數(shù),那時是手動添加的get和set方法,這里我們用lombok注解來簡化掉之前的樣板代碼:

@Setter@Getterpublic 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)行程序,訪問接口

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

還是和之前一樣,能夠請求成功并正常的返回數(shù)據(jù)。

一般情況下,我們會針對返回的數(shù)據(jù),來單獨(dú)定義對象來進(jìn)行描述,這里我們也定義一個

@Builder@Getterpublic class BannerResponseDto { private int id; private String name; private Integer pos;}

這里用到了@Builder、@Getter,在接口中構(gòu)造對象并返回:

@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)建對象,省去了大量的set代碼,而且可讀性也很好。

訪問接口,看看數(shù)據(jù)返回的時候正常:

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

與之前是一樣的,能夠正常返回數(shù)據(jù),那接下來我們就正式看一下,spring-boot如何進(jìn)行參數(shù)校驗了。

參數(shù)校驗

參數(shù)校驗就是說對前端傳過來的數(shù)據(jù)進(jìn)行合理性校驗,看他能否滿足我們的業(yè)務(wù)規(guī)則,那這些對參數(shù)進(jìn)行校驗的代碼是該放在那里呢,是在Controller里還是說單獨(dú)存放,又獲取采用其他什么方式呢?

參數(shù)校驗該怎么做

首先要明確的一點(diǎn),在Controller,不應(yīng)該有大量邏輯判斷的代碼,為什么呢,我們可想想當(dāng)參數(shù)較多的時候,對每個參數(shù)進(jìn)行合理性校驗的話,那代碼量該有多少,那就會嚴(yán)重污染Controller,導(dǎo)致維護(hù)起來是很艱難的,所以應(yīng)該要有一個合理的機(jī)制能把校驗的代碼抽離出來,從而保證Controller的簡潔性。

在java的世界里有這么個概念叫做 JSR,是Java Specification Requests的首字母縮寫,是編程語言Java規(guī)范請求或者說是Java語言的說明書,既然是說明書那就一定有各個版本,在JSR-303版本中,提出了Bean Validation的驗證規(guī)范,目前主要有兩個兩個框架實(shí)現(xiàn)了Bean Validation規(guī)范,一個事自帶的javax.validation.api和hibernate-validator框架,而hibernate-validator框架應(yīng)用的更加廣泛一點(diǎn)。

那我們就用這種Bean Validation這種驗證框架進(jìn)行參數(shù)的驗證

實(shí)戰(zhàn)

@RestController@Validatedpublic 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)?shù)的pos,限制其輸入?yún)?shù)最大值為10,運(yùn)行程序我們來測試一下:

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

訪問接口http://localhost:8081/v3/banner?id=12&pos=33后,看到我們控制臺的輸出提示輸入不能超過10,這里的這個message不是我寫的哈,這是java國際化后的效果能夠根據(jù)你所在地區(qū)決定顯示什么語言。

當(dāng)然這里我們也可以自定義錯誤的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;}

還是上面的請求路徑,看看控制臺輸出:

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

可以看到控制臺輸出了我們自定義的內(nèi)容。這里有一點(diǎn)要注意,要想使得校驗生效,比如在Controller上方打上@Validated注解,至于為什么我們后面分解。

上面的驗證都是比較基礎(chǔ)的數(shù)據(jù)類型,但是如果現(xiàn)在要有驗證更加復(fù)雜一點(diǎn)的java對象呢,又該如何操作,那接下來我們再看看這部分的內(nèi)容。

java對象進(jìn)行驗證單個對象

還是用上面的BannerResponseDto來進(jìn)行演示

import org.hibernate.validator.constraints.Length;@Setter@Getterpublic class BannerCreateDto { @Length(min = 2, max = 4, message = 'banner名稱必須是2-10個字符') private String name; private Integer pos;}

對于這些基礎(chǔ)類型的成員變量仍然使用這些基礎(chǔ)注解進(jìn)行校驗定義,上面我們使用了 @Length注解來定義banner名稱的字符長度范圍,并定義發(fā)生錯誤時提示的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ā)校驗機(jī)制。

嵌套

如果某個類的成員變量也是一個自定義對象,那校驗該是什么樣的呢,下面我們來看一下。

先定義一個新的對象,用來接收banner到的素材信息

@Getter@Setterpublic class MaterialDto { @Length(min = 2, max = 5, message = '素材的名稱長度范圍必須在2-5之內(nèi)') private String name;}

然后banner對象增加一個成員變量

@Setter@Getterpublic class BannerCreateDto { @Length(min = 2, max = 4, message = 'banner名稱必須是2-10個字符') private String name; private Integer pos; @Valid private MaterialDto materialDto;}

這里有一點(diǎn),要想使得這種級聯(lián)的關(guān)系能夠觸發(fā)校驗機(jī)制,必須 @Valid注解進(jìn)行標(biāo)記,我們來請求一下url看看效果

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

可以看到校驗沒通過,再看看控制臺輸出內(nèi)容:

如何在spring boot中進(jìn)行參數(shù)校驗示例詳解

輸出了我們定義的錯誤信息。

總結(jié)

本篇文章主要介紹了里面lombok的使用,以及校驗規(guī)范介紹和校驗框架基本注解的使用,還有自定義對象校驗,下篇文章我們將通過自定義注解來實(shí)現(xiàn)更加個性化的校驗規(guī)則,敬請期待。

到此這篇關(guān)于如何在spring-boot中進(jìn)行參數(shù)校驗的文章就介紹到這了,更多相關(guān)spring-boot 參數(shù)校驗內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产欧美亚洲精品第一区 | 午夜精品视频在线观看 | 大看蕉a在线观看 | 久久久久久久久a免费 | 美国一级毛片片免费 | 日韩高清性爽一级毛片免费 | 亚洲欧美日韩成人 | 精品一区二区三区影院在线午夜 | 国产人成精品香港三级古代 | 天天草影院 | 婷婷六月在线 | 午夜丝袜美腿福利视频在线看 | 国产一级一片免费播放 | 亚洲第一页在线视频 | 在线播放黄色片 | 欧美黑人特大巨黑吊 | 欧美日韩国产在线成人网 | 嫩草影院在线入口 | 国产淫视 | 久久99国产这里有精品视 | 亚洲欧美4444kkkk | 亚洲免费毛片 | 精品亚洲成a人在线播放 | 国产高清一 | 国产午夜精品福利视频 | 亚洲一区二区三区国产精品 | 久久精品国产亚洲麻豆小说 | 97国产在线播放 | mmmmxxxx国产在线观看 | 毛片黄片免费看 | 色综合色 | 天天综合色网 | 黄色片在线免费 | 你操综合| 久久一区二区三区免费 | 亚洲人视频在线观看 | h网站免费在线观看 | 午夜视频1000部免费看 | 欧美精品国产第一区二区 | 国产精品午夜寂寞视频 | 视频精品一区二区三区 |