激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

2022-02-26 00:26骨力 Java教程

這篇文章主要介紹了快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

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

 

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

如果是SpringBoot項目,引入web開發(fā)包,就不需要再單獨引入@valid依賴了、因為他存在于Web開發(fā)包中的最核心之中

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

如果不是SpringBoot項目,要在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>

校驗實體類大部分人使用的方法肯定都是controller層里面拿出來判斷是否為空,其實可以直接通過實體類中的注釋@NotNull直接校驗,如圖

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

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

 

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

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

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

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

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

 

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

此時對象字段校驗生效,但是出錯時返回的是很凌亂的內(nèi)容,如圖:

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

 

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

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

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

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

 

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

 

1、探究原因

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

首先定位2個注解所屬的包:

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

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

@Valid 在 validation-api 包下 2.0.2 版本

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

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

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

原來是在引入 Spring-boot-start-web 的時候,就引入了該依賴

兩個注解存在不同的包,而@NotNull ,@Null ,@Size ,@Max 等校驗注解是哪里的呢?

快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決

這些注解都是在 api 包下

 

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

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

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

經(jīng)過測試,只有請求實體參數(shù)列表前加@Validated 才會生效,即使@Validated 加在類上也無法生效

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

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

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

 

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

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

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

結(jié)論:暫不清楚@Valid 設(shè)計出現(xiàn)的原因,所以的校驗@Validate 均可以實現(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());
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_41444892/article/details/103427461

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产乱码久久久久 | 狠狠干天天操 | 久久久精品综合 | 国产午夜探花 | av国语 | 狼人狠狠干 | 国产精品啪一品二区三区粉嫩 | 亚洲午夜天堂吃瓜在线 | 国产精品一区99 | 久久久久一区二区三区四区五区 | 成年人视频在线免费观看 | 中文国产在线视频 | 欧洲成人一区 | 亚洲网站一区 | 久久亚洲国产精品 | 免费高清一级欧美片在线观看 | 成人污在线 | 美女av在线免费观看 | av电影在线观看网站 | 中文字幕在线亚洲 | 91性高湖久久久久久久久网站 | 亚洲一区动漫 | 91成人久久| 娇妻被各种姿势c到高潮小说 | xxxxhd73国产| 羞羞视频免费网站男男 | 日韩蜜桃视频 | 99精品在线观看 | 日本黄色免费片 | 精品成人av一区二区在线播放 | 九九综合九九 | 成年免费看 | 亚洲一区动漫 | 免费看成人av | 亚洲第一成人在线视频 | av电影在线观看网址 | 欧美一级黄色片免费观看 | 色中色激情影院 | 毛片大全免费 | 99精品在线观看 | 黄色aaa视频 |