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

快速校驗(yàn)實(shí)體類時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決

 更新時(shí)間:2021年10月23日 09:57:46   作者:骨力  
這篇文章主要介紹了快速校驗(yàn)實(shí)體類時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

校驗(yàn)實(shí)體類參數(shù)內(nèi)容不能為空時(shí)使用注解校驗(yàn)無(wú)效

使用@valid注解首先引入依賴

如果是SpringBoot項(xiàng)目,引入web開發(fā)包,就不需要再單獨(dú)引入@valid依賴了、因?yàn)樗嬖谟赪eb開發(fā)包中的最核心之中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

如果不是SpringBoot項(xiàng)目,要在Maven的Pom中顯式引入@valid依賴

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
 
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

校驗(yàn)實(shí)體類大部分人使用的方法肯定都是controller層里面拿出來(lái)判斷是否為空,其實(shí)可以直接通過(guò)實(shí)體類中的注釋@NotNull直接校驗(yàn),如圖

在這里插入圖片描述

但經(jīng)過(guò)我的實(shí)驗(yàn),不知道什么原因,在我的項(xiàng)目中并沒有起到作用,解決如下

1、更換方法入?yún)㈩愋?/h3>

在網(wǎng)上看到@Valid是可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上,而我一開始controller層中使用的是json接收的,轉(zhuǎn)換成實(shí)體類后再校驗(yàn)的,如圖

在這里插入圖片描述

修改如下:在controller接收數(shù)據(jù)時(shí)直接以對(duì)象接收,在入口中直接以注解進(jìn)行校驗(yàn)

在這里插入圖片描述

2、錯(cuò)誤內(nèi)容過(guò)多

此時(shí)對(duì)象字段校驗(yàn)生效,但是出錯(cuò)時(shí)返回的是很凌亂的內(nèi)容,如圖:

在這里插入圖片描述

3、使用對(duì)象接收錯(cuò)誤內(nèi)容,按自己要求輸出

上面的圖片可看出,返回內(nèi)容中defaultMessage就是想要輸出的內(nèi)容,所以在方法中添加一個(gè)接收錯(cuò)誤信息的類型為BindingResult的對(duì)象,如果對(duì)象有數(shù)據(jù),則輸出錯(cuò)誤數(shù)據(jù),如圖:

在這里插入圖片描述

另一層面的實(shí)現(xiàn)了實(shí)體類的參數(shù)校驗(yàn),大家如果有更好的方法可以留言交流

springboot 校驗(yàn)機(jī)制 @Validated @Valid

1、探究原因

在開發(fā)的過(guò)程中一直迷惑 @Validated 與 @Valid 的用法,有時(shí)候是@Validated ,有時(shí)候是@Valid 。雖然能夠?qū)崿F(xiàn)校驗(yàn),但是還是不夠明確何時(shí)能夠生效,不了解他生效的情況

首先定位2個(gè)注解所屬的包:

@Validated 在 spring-context 包下屬于spring 提供的核心包

@Valid 在 validation-api 包下 2.0.2 版本

@Validated 是spring 核心包,是每個(gè)項(xiàng)目都有的,那么 api 是如何引入的? 查看maven 依賴

原來(lái)是在引入 Spring-boot-start-web 的時(shí)候,就引入了該依賴

兩個(gè)注解存在不同的包,而@NotNull ,@Null ,@Size ,@Max 等校驗(yàn)注解是哪里的呢?

這些注解都是在 api 包下

2、使用@Validated 實(shí)現(xiàn)校驗(yàn)機(jī)制

情景一: 查詢參數(shù)是一個(gè)實(shí)體,Get 請(qǐng)求,在不添加任何注解的情況下,查詢是正常的,實(shí)體參數(shù)字段都為null

現(xiàn)在需求 id 字段不能為空,在實(shí)體id 字段標(biāo)記 @NotNull ,繼續(xù)查詢,發(fā)現(xiàn)注解沒有生效

經(jīng)過(guò)測(cè)試,只有請(qǐng)求實(shí)體參數(shù)列表前加@Validated 才會(huì)生效,即使@Validated 加在類上也無(wú)法生效

情景二: 查詢參數(shù)是基本或者引用類型字段,參數(shù)列表中加入 @NutNull 修改該字段。發(fā)現(xiàn)無(wú)法生效

經(jīng)過(guò)測(cè)試:只有全局類上加@Validated 才會(huì)生效,即使參數(shù)列表中加入 @Validated 也無(wú)法生效

產(chǎn)生異常也有所不同:在校驗(yàn)生效的情況下,實(shí)體類校驗(yàn)產(chǎn)生的異常是:BindException , 而參數(shù)列表產(chǎn)生的異常是:ConstraintViolationException

3、使用@Valid 實(shí)現(xiàn)校驗(yàn)機(jī)制

場(chǎng)景一:與上述一致,只有@Valid 作用在參數(shù)列表前才會(huì)生效

場(chǎng)景二:@Valida 不管是左右在參數(shù)列表還是類上,都無(wú)法生效。只能使用@Validated 全局設(shè)置

結(jié)論:暫不清楚@Valid 設(shè)計(jì)出現(xiàn)的原因,所以的校驗(yàn)@Validate 均可以實(shí)現(xiàn)

附加全局異常捕獲:

@RestControllerAdvice
public class GlobalException {
    @ExceptionHandler({BindException.class})
    public RespResult validationException(BindException exception){
        List<ObjectError> errors =  exception.getAllErrors();
        if(!CollectionUtils.isEmpty(errors)){
            StringBuilder sb = new StringBuilder();
            errors.forEach(e->sb.append(e.getDefaultMessage()).append(","));
            return new RespResult(400, sb.toString());
        }
        return new RespResult(500, exception.getLocalizedMessage());
    }
    @ExceptionHandler({ConstraintViolationException.class})
    public RespResult constraintViolationException(ConstraintViolationException exception){
        Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
        if(!CollectionUtils.isEmpty(constraintViolations)){
            StringBuilder sb = new StringBuilder();
            constraintViolations.forEach(e->sb.append(e.getMessage()).append(","));
            return new RespResult(400, sb.toString());
        }
        return new RespResult(500, exception.getLocalizedMessage());
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis批處理、Mysql深分頁(yè)操作

    Mybatis批處理、Mysql深分頁(yè)操作

    這篇文章主要介紹了Mybatis批處理、Mysql深分頁(yè)操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • java使用Abobe Acrobat DC生成模板

    java使用Abobe Acrobat DC生成模板

    這篇文章主要介紹了java使用Abobe Acrobat DC生成模板,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring中ClassPath指的是哪些地方

    Spring中ClassPath指的是哪些地方

    在Spring應(yīng)用中,ClassPath指的是應(yīng)用程序的類加載路徑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Java中AIO、BIO、NIO應(yīng)用場(chǎng)景及區(qū)別

    Java中AIO、BIO、NIO應(yīng)用場(chǎng)景及區(qū)別

    本文主要介紹了Java中AIO、BIO、NIO應(yīng)用場(chǎng)景及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章給大家介紹了Myeclipse部署Tomcat的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-07-07
  • java設(shè)計(jì)模式策略模式圖文示例詳解

    java設(shè)計(jì)模式策略模式圖文示例詳解

    這篇文章主要為大家介紹了java設(shè)計(jì)模式策略模式圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程的解決方法

    Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程的解決方法

    怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中實(shí)現(xiàn)批量插入數(shù)據(jù)?接下來(lái)通過(guò)本文給大家介紹Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程,需要的朋友可以參考下
    2017-03-03
  • 三張圖徹底了解Java中字符串的不變性

    三張圖徹底了解Java中字符串的不變性

    這篇文章主要通過(guò)三張圖徹底幫助大家了解Java中字符串的不變性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Springboot+mybatis-plus+注解實(shí)現(xiàn)數(shù)據(jù)權(quán)限隔離

    Springboot+mybatis-plus+注解實(shí)現(xiàn)數(shù)據(jù)權(quán)限隔離

    本文將結(jié)合實(shí)例代碼,介紹Springboot+mybatis-plus+注解實(shí)現(xiàn)數(shù)據(jù)權(quán)限隔離,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 解讀SpringMVC?請(qǐng)求參數(shù)接收

    解讀SpringMVC?請(qǐng)求參數(shù)接收

    這篇文章主要介紹了SpringMVC請(qǐng)求參數(shù)接收的相關(guān)操作,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評(píng)論

通榆县| 青海省| 江西省| 巨鹿县| 将乐县| 汤阴县| 区。| 东光县| 和静县| 沙河市| 临汾市| 南陵县| 剑河县| 桃园县| 孟州市| 东乡| 荆州市| 体育| 九寨沟县| 乡宁县| 革吉县| 琼结县| 梅州市| 汉中市| 长寿区| 墨竹工卡县| 垦利县| 沿河| 柏乡县| 南江县| 广元市| 垦利县| 会宁县| 丰都县| 卢氏县| 永和县| 乳山市| 余庆县| 睢宁县| 庄河市| 峡江县|