中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 如何解決快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的問題

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

發布時間:2021-10-23 13:42:21 來源:億速云 閱讀:1306 作者:iii 欄目:開發技術

這篇文章主要講解了“如何解決快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何解決快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的問題”吧!

目錄
  • 校驗實體類參數內容不能為空時使用注解校驗無效

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

    • 1、更換方法入參類型

    • 2、錯誤內容過多

    • 3、使用對象接收錯誤內容,按自己要求輸出

  • springboot 校驗機制 @Validated @Valid

    • 1、探究原因

    • 2、使用@Validated 實現校驗機制

    • 3、使用@Valid 實現校驗機制

校驗實體類參數內容不能為空時使用注解校驗無效

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

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

<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注解無效的問題

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

1、更換方法入參類型

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

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

修改如下:在controller接收數據時直接以對象接收,在入口中直接以注解進行校驗

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

2、錯誤內容過多

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

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

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

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

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

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

springboot 校驗機制 @Validated @Valid

1、探究原因

在開發的過程中一直迷惑 @Validated 與 @Valid 的用法,有時候是@Validated ,有時候是@Valid 。雖然能夠實現校驗,但是還是不夠明確何時能夠生效,不了解他生效的情況

首先定位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 實現校驗機制

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

現在需求 id 字段不能為空,在實體id 字段標記 @NotNull ,繼續查詢,發現注解沒有生效

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

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

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

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

3、使用@Valid 實現校驗機制

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

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

結論:暫不清楚@Valid 設計出現的原因,所以的校驗@Validate 均可以實現

附加全局異常捕獲:

@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());
    }
}

感謝各位的閱讀,以上就是“如何解決快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的問題”的內容了,經過本文的學習后,相信大家對如何解決快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

攀枝花市| 且末县| 尼玛县| 邳州市| 永康市| 桃园市| 白水县| 尤溪县| 维西| 黄冈市| 南木林县| 克山县| 肇庆市| 桓仁| 西城区| 邹平县| 甘肃省| 金门县| 栾川县| 禄丰县| 泸水县| 和硕县| 壶关县| 彰化市| 深水埗区| 湄潭县| 北碚区| 六安市| 远安县| 河曲县| 阿瓦提县| 高碑店市| 垫江县| 铜鼓县| 景东| 安化县| 章丘市| 彩票| 浏阳市| 新和县| 若羌县|