最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年05月15日 08:43:19   作者:測(cè)試軒  
這篇文章主要介紹了如何在spring-boot中進(jìn)行參數(shù)校驗(yàn)及l(fā)ombok的使用詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

上文我們討論了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國(guó)際化后的效果能夠根據(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名稱的字符長(zhǎng)度范圍,并定義發(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 = "素材的名稱長(zhǎng)度范圍必須在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ò)誤信息。

總結(jié)

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

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

相關(guān)文章

  • 如何實(shí)現(xiàn)Spring?Event(異步事件)

    如何實(shí)現(xiàn)Spring?Event(異步事件)

    這篇文章主要介紹了如何實(shí)現(xiàn)Spring?Event(異步事件)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 老生常談java垃圾回收算法(必看篇)

    老生常談java垃圾回收算法(必看篇)

    下面小編就為大家?guī)硪黄仙U刯ava垃圾回收算法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 死磕 java同步系列之synchronized解析

    死磕 java同步系列之synchronized解析

    這篇文章主要介紹了Java中syncronized正確使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-06-06
  • java使用Abobe Acrobat DC生成模板

    java使用Abobe Acrobat DC生成模板

    這篇文章主要介紹了java使用Abobe Acrobat DC生成模板,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法

    SpringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法

    下面小編就為大家?guī)硪黄猄pringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    本文詳細(xì)解析了如何使用Java的Paths.get()、resolve()和Spring的transferTo()方法處理文件上傳功能,并給出了完整的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • java中stringBuilder的用法詳解

    java中stringBuilder的用法詳解

    這篇文章主要介紹了java中stringBuilder的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 交換兩個(gè)變量的數(shù)值實(shí)現(xiàn)方法

    Java 交換兩個(gè)變量的數(shù)值實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狫ava 交換兩個(gè)變量的數(shù)值實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • Java中equals和hashcode用法

    Java中equals和hashcode用法

    `equals`和`hashCode`方法在Java中密切相關(guān),必須保持一致性,如果兩個(gè)對(duì)象通過`equals`方法相等,它們的`hashCode`也必須相同,這對(duì)于基于哈希的數(shù)據(jù)結(jié)構(gòu)至關(guān)重要,因?yàn)檫@些結(jié)構(gòu)依賴哈希值進(jìn)行快速查找和存儲(chǔ),為了減少哈希沖突
    2025-01-01
  • Jedis操作Redis數(shù)據(jù)庫的方法

    Jedis操作Redis數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細(xì)介紹了Jedis操作Redis數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評(píng)論

尤溪县| 尤溪县| 瑞金市| 榕江县| 广宗县| 赤水市| 黄山市| 盈江县| 汝南县| 承德县| 新邵县| 若羌县| 徐州市| 沈阳市| 清镇市| 临夏县| 福建省| 汤阴县| 阳江市| 梁河县| 兴山县| 临高县| 长葛市| 沁阳市| 娄烦县| 满洲里市| 孝感市| 潜山县| 定远县| 宣化县| 郯城县| 佳木斯市| 博罗县| 沛县| 华容县| 开原市| 汉源县| 龙胜| 广饶县| 赣榆县| 钟祥市|