Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中@Valid 與 @Validated 注解的詳解

    • 引言
    • @Valid注解
      • 功能介紹
      • 使用場景
      • 代碼樣例
    • @Validated注解
      • 功能介紹
      • 使用場景
      • 代碼樣例
    • @Valid與@Validated的區別
    • 結論

引言

在Spring Boot應用中,參數校驗是確保數據完整性和一致性的重要手段。@Valid和@Validated注解是Spring Boot中用于參數校驗的兩個核心注解。本文將詳細介紹這兩個注解的用法、區別以及代碼樣例。

@Valid注解

功能介紹

@Valid是Java EE提供的標準注解,它是JSR 303規范的一部分,主要用于Hibernate Validation等場景。在Spring Boot中,@Valid注解用于觸發參數校驗,確保請求參數的合法性。

使用場景

@Valid注解可以用于方法參數、構造函數、方法參數和成員屬性上。它主要用于嵌套校驗,即對于對象中的屬性值(可能是另一個對象)進行校驗。

代碼樣例

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.Valid;public class User {@NotBlank(message = "用戶名不能為空")private String username;@NotNull(message = "密碼不能為空")private String password;@Validprivate Address address;// Getter 和 Setter
}public class Address {@NotBlank(message = "國家不能為空")private String country;@NotBlank(message = "城市不能為空")private String city;// Getter 和 Setter
}import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@PostMapping("/addUser")public String addUser(@Valid @RequestBody User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "用戶添加成功";}
}

在上述代碼中,User類中的address屬性使用了@Valid注解,表示對address對象進行嵌套校驗。在UserController中,addUser方法使用了@Valid注解對傳入的User對象進行校驗,并使用BindingResult捕獲校驗錯誤。

@Validated注解

功能介紹

@Validated是Spring框架特有的注解,屬于Spring的一部分,也是JSR 303的一個變種。它提供了一些@Valid所沒有的額外功能,比如分組驗證。@Validated注解可以用在類、方法和方法參數上,但不能用于成員屬性。

使用場景

@Validated注解主要用于支持分組驗證,可以更細致地控制驗證過程。此外,由于它是Spring專有的,因此可以更好地與Spring的其他功能(如Spring的依賴注入)集成。

代碼樣例

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.groups.Default;public interface ValidationGroups {interface Insert extends Default {}interface Update {}
}public class Project {@NotBlank(message = "ID不能為空", groups = ValidationGroups.Update.class)private String id;@NotBlankprivate String name;@Min(value = 1, message = "預算不能小于1", groups = ValidationGroups.Insert.class)private int budget;// Getter 和 Setter
}import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;@RestController
public class ProjectController {@PostMapping("/insertProject")public String insertProject(@Validated(value = ValidationGroups.Insert.class) @RequestBody Project project, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "項目插入成功";}@PostMapping("/updateProject")public String updateProject(@Validated(value = ValidationGroups.Update.class) @RequestBody Project project, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "項目更新成功";}
}

在上述代碼中,我們定義了一個ValidationGroups接口,用于分組驗證。Project類中的id屬性在Update分組下必填,而budget屬性在Insert分組下必填且不能小于1。在ProjectController中,insertProject方法使用@Validated(value = ValidationGroups.Insert.class)注解對傳入的Project對象進行Insert分組的校驗,而updateProject方法則使用@Validated(value = ValidationGroups.Update.class)注解進行Update分組的校驗。

@Valid與@Validated的區別

  1. 嵌套校驗:@Valid支持嵌套校驗,而@Validated不支持。在需要嵌套校驗的場景下,應使用@Valid。
  2. 分組校驗:@Validated支持分組校驗,而@Valid不支持。在需要根據不同場景應用不同校驗規則的情況下,應使用@Validated。
  3. 使用范圍:@Valid可以用在方法、構造函數、方法參數和成員屬性上,而@Validated只能用在類、方法和方法參數上。

結論

@Valid和@Validated注解在Spring Boot的參數校驗中扮演著重要角色。掌握這兩個注解的用法和區別,可以幫助開發者更靈活地進行參數校驗,確保數據的完整性和一致性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899555.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++搜索

功能擴展說明: 圖類封裝:將圖數據結構封裝為類,提高代碼復用性 最短路徑查找:基于BFS實現未加權圖的最短路徑查找 路徑重構:通過parent數組回溯構建完整路徑 異常處理:當路徑不存在時返回空向量 復雜度分析…

2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

本來想刷省賽題呢,結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但,又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到,那些與我一同前行的,來自遠方的朋友😉 大綱: 一、子2023-&#xff…

CSS學習筆記6——網頁布局

目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

sqlalchemy:將mysql切換到OpenGauss

說明 之前python的項目使用的mysql,近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy,測試下來發現不用改代碼,只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在:https:…

uniapp 獲取dom信息(封裝獲取元素信息工具函數)

在uniapp開發中,需要獲取到dom的信息,需要用到uniapp的指定方式 uni.createSelectorQuery(),但是每次需要用到的時候都需要很長一段的繁瑣代碼,本篇文章將呈現獲取dom信息方法封裝,話不多說,上菜&#xff1…

Linux之數據鏈路層

Linux之數據鏈路層 一.以太網1.1以太網幀格式1.2MAC地址1.3MTU 二.ARP協議2.1ARP協議工作流程2.2ARP協議格式 三.NAT技術四.代理服務4.1正向代理4.2反向代理 五.四大層的學習總結 一.以太網 在我們學習完了網絡層后我們接下來就要進入數據鏈路層的學習了,在學習完網…

MySQL的基礎語法2(函數-字符串函數、數值函數、日期函數和流程函數 )

目錄 一、字符串函數 1.常見字符串函數 ?編輯 2.字符串函數的基本使用 3.字符串函數的數據庫案例演示 二、數值函數 1.常見數值函數(如下): 2.數值函數的基本使用 3.數值函數的數據庫案例演示 三、日期函數 1.常見的日期函數 2.日…

全新版租賃商城小程序源碼系統 源碼開源支持二開+圖文搭建教程

在互聯網商業的浪潮中,租賃業務憑借其獨特的優勢,正逐漸成為市場的新寵。對于開發者而言,快速搭建一個功能完備的租賃商城小程序,不僅能滿足市場需求,還能為自己的業務拓展帶來新的機遇。分享一款全新版租賃商城小程序…

Cent OS7+Docker+Dify

由于我之前安裝了Dify v1.0.0,出現了一些問題:無法刪除,包括:知識庫中的文件、應用、智能體、工作流,都無法刪除。現在把服務器初始化,一步步重新安裝,從0到有。 目錄 1、服務器重裝系統和配置…

OSI 七層模型和四層模型(TCP/IP 模型)

文章目錄 前言一、OSI 七層模型二、TCP/IP 四層模型三、運行協議及設備1. OSI 七層模型2. TCP/IP 四層模型3. 運行協議4. 各類設備的作用 總結 前言 OSI 七層模型和四層模型(TCP/IP 模型)是兩種常見的網絡協議分層架構,它們的主要區別如下&a…

AI的未來:機遇、挑戰與發展方向

📝個人主頁🌹:一ge科研小菜雞-CSDN博客 🌹🌹期待您的關注 🌹🌹 1. 引言 人工智能(AI)已經成為當今世界最具革命性的技術之一,它正在深刻改變各個行業&#x…

javascript實現一個函數,將字符串中的指定子串全部替換為另一個字符串的原理,以及多種方法實現。

大白話javascript實現一個函數,將字符串中的指定子串全部替換為另一個字符串的原理,以及多種方法實現。 在JavaScript里,要是你想把字符串里的指定子串都替換成另外一個字符串,有不少方法可以實現。下面我會詳細介紹實現的原理&a…

硬件基礎--16_公式梳理

公式梳理 歐姆定律: IU/R 1.歐姆定律有局限性,僅適用于純電阻電路(或者說純電阻元器件,純電阻設備) 2.純電阻電路:消耗的電能僅轉化為熱能,沒有其他形式的能量轉換。 功率計算:PUI 1.導出公式:PU2 /R 2.導出公式:PI2 R 焦耳定律:QI2 Rt 1.導…

npm i 出現的網絡問題

npm i 出現的網絡問題 解決方案: npm config list 查看.npmrc文件中是否配置了proxy刪除.npmrc文件中的proxy,保存。重新執行npm i命令。 順便說說解決這個問題的心里路程 每次安裝vue的環境的時候,經常遇到npm安裝一些插件或者是依賴的時…

使用vue cli 5.0 在vscode中運行vue命令報錯

1、運行 vue -- version 報錯 2、在cmd 命令行 執行 vue --version 正常 3、在終端中輸入 get-ExecutionPolicy,查看當前權限 4、執行 set-executionpolicy remotesigned 命令設置為可用模式,但是報錯 5、使用管理員打開power shell 執行 G…

瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用筆記

一、源碼 官方在librga中給了很多 demo 以供參考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…

Spring MVC:從歷史演變到實戰入門

1. Java Web的發展歷史與MVC模式 1.1 Model I與Model II的演進 Model I&#xff08;JSPJavaBean&#xff09; 作為早期Java Web開發的主流模式&#xff0c;其核心架構如下&#xff1a; graph LR A[客戶端] --> B[JSP頁面] B --> C{業務邏輯} C --> D[JavaBean] D -…

AI賦能,防御無界:群聯云防護如何顛覆傳統DDoS防御格局?

一、AI驅動的動態防御體系 智能流量調度 群聯云防護通過AI算法實時分析流量特征&#xff0c;動態分配清洗節點。當檢測到攻擊時&#xff0c;系統能在秒級內將流量切換至備用節點&#xff0c;避免單點過載。相較傳統高防IP依賴靜態規則&#xff0c;群聯的調度策略可減少50%的誤封…

R --- Error in library(***) : there is no package called ‘***’ (服務器非root用戶)

步驟 步驟一&#xff1a;在自己目錄下創建R包安裝路徑步驟二&#xff1a;配置用戶本地的R庫路徑步驟三&#xff1a;安裝缺失的包&#xff08;在終端&#xff09;步驟四&#xff1a;驗證安裝 步驟一&#xff1a;在自己目錄下創建R包安裝路徑 mkdir -p ~/R_libs步驟二&#xff1…

HarmonyOS NEXT狀態管理實踐

在HarmonyOS NEXT開發中&#xff0c;狀態管理是構建高效、響應式應用的核心。本文深入探討狀態管理的最佳實踐&#xff0c;結合代碼示例與案例分析&#xff0c;幫助開發者掌握這一關鍵技能。 一、狀態管理裝飾器的合理使用 HarmonyOS NEXT提供多種狀態管理裝飾器&#xff0c;…