springboot的實體類字段校驗的分組校驗

分組校驗(Group Validation)允許在不同的場景下對同一個實體類應用不同的校驗規則。例如,在新增數據更新數據時,可能需要對某些字段的校驗規則進行調整。以下是分組校驗的具體實現步驟:


一、定義分組接口

創建空的標記接口(僅用于分組標識):

// 新增時的校驗分組
public interface CreateGroup {}// 更新時的校驗分組
public interface UpdateGroup {}

二、在實體類中指定分組

在字段的校驗注解中,通過 groups 屬性指定所屬分組:

public class User {@NotBlank(message = "用戶ID不能為空", groups = UpdateGroup.class)private String id;@NotBlank(message = "用戶名不能為空", groups = CreateGroup.class)private String username;@Size(min = 6, max = 20, message = "密碼長度需在6到20位之間", groups = {CreateGroup.class, UpdateGroup.class})private String password;// 省略Getter和Setter
}
  • id 字段:僅在 UpdateGroup 分組下校驗(更新時必須校驗)。
  • username 字段:僅在 CreateGroup 分組下校驗(新增時必須校驗)。
  • password 字段:在 CreateGroupUpdateGroup 分組下均校驗(新增和更新時都校驗)。

三、在Controller中指定校驗分組

在Controller方法參數上使用 @Validated 注解(注意是 Spring 的注解,而非 @Valid),并指定分組:

@RestController
public class UserController {// 新增用戶(校驗 CreateGroup 分組)@PostMapping("/users")public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {return "用戶新增成功";}// 更新用戶(校驗 UpdateGroup 分組)@PutMapping("/users/{id}")public String updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {return "用戶更新成功";}
}

四、全局異常處理

分組校驗失敗會拋出 ConstraintViolationException,需在全局異常處理器中捕獲:

@RestControllerAdvice
public class GlobalExceptionHandler {@ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler(ConstraintViolationException.class)public Map<String, Object> handleConstraintViolationException(ConstraintViolationException ex) {Map<String, String> errors = new HashMap<>();ex.getConstraintViolations().forEach(violation -> {String field = violation.getPropertyPath().toString();String message = violation.getMessage();errors.put(field, message);});return Map.of("code", HttpStatus.BAD_REQUEST.value(),"message", "參數校驗失敗","data", errors);}
}

五、測試示例

1. 新增用戶(觸發 CreateGroup 分組校驗)

請求:

POST /users
Content-Type: application/json{"password": "12345"
}

響應:

{"code": 400,"message": "參數校驗失敗","data": {"username": "用戶名不能為空","password": "密碼長度需在6到20位之間"}
}
2. 更新用戶(觸發 UpdateGroup 分組校驗)

請求:

PUT /users/123
Content-Type: application/json{"password": "12345"
}

響應:

{"code": 400,"message": "參數校驗失敗","data": {"id": "用戶ID不能為空","password": "密碼長度需在6到20位之間"}
}

六、分組校驗的高級用法

1. 多分組組合校驗

可以在 @Validated 中同時指定多個分組:

@Validated({CreateGroup.class, AnotherGroup.class})
2. 默認分組

如果字段未指定 groups 屬性,則默認屬于 Default 分組。可以通過 @Validatedvalue 屬性同時包含默認分組:

@Validated(value = {UpdateGroup.class, Default.class})
3. 繼承分組

分組接口可以繼承其他接口,形成層級關系:

public interface AdvancedGroup extends CreateGroup {}

七、分組校驗 vs 多個DTO

方案優點缺點
分組校驗避免創建多個相似DTO,減少冗余代碼實體類可能包含不同場景的注解
多個DTO職責單一,結構清晰需要維護多個DTO類

總結

通過分組校驗,可以靈活控制不同場景下的校驗規則,避免為每個場景創建單獨的DTO類。關鍵步驟:

  1. 定義分組接口。
  2. 在實體類字段的校驗注解中指定 groups
  3. 在Controller方法參數上使用 @Validated(分組.class)
  4. 全局捕獲 ConstraintViolationException 并返回自定義錯誤。

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

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

相關文章

vue3,Element Plus中隱藏樹el-tree滾動條

el-tree&#xff0c;節點過多&#xff0c;默認會出現垂直滾動條&#xff0c;顯得不美觀 可以使用隱藏組件 el-scrollbar 將 el-tree 包裹&#xff0c;就可以隱藏垂直滾動條 <el-scrollbar> <el-tree> ... </el-tree> </el-scrollbar> /* 滾動條禁用鼠…

mysql練習

創建數據庫db_ck&#xff0c;再創建表t_hero&#xff0c;將四大名著中的主要人物都插入這個表中&#xff0c;將實現過程中sql提交上上來 1、創建數據庫db_ck mysql> create database db_ck; 2、創建表t_hero mysql> use db_ck Database changed mysql> create table …

svn刪除所有隱藏.svn文件,文件夾脫離svn控制

新建一個文件&#xff0c;取名remove-svn-folders.reg&#xff0c;輸入如下內容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

文心一言:中國大模型時代的破局者與探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作為中國AI領域的代表性產品&#xff0c;迅速成為行業焦點。這款基于百度自主研發的“文心大模型”打造的對話式AI工具&am…

Ubuntu 安裝docker docker-compose

Docker 通過提供輕量級、可移植且高效的解決方案&#xff0c;簡化了軟件開發和部署。“docker build”命令是 Docker 鏡像創建過程的核心。本文將探討 Docker 構建命令、用法以及 Docker 構建的優化。 Docker 構建有什么作用&#xff1f; Docker build 是一個命令行界面 CLI命…

Unity開發——CanvasGroup組件介紹和應用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染順序的組件。 一、常用屬性的解釋 1、alpha&#xff1a;控制UI的透明度 類型&#xff1a;float&#xff0c;0.0 ~1.0&#xff0c; 其中 0.0 完全透明&#xff0c;1.0 完全不透明。 通過調整alpha值可以實現UI的淡入淡…

每天五分鐘深度學習PyTorch:向更深的卷積神經網絡挑戰的ResNet

本文重點 ResNet大名鼎鼎,它是由何愷明團隊設計的,它獲取了2015年ImageNet冠軍,它很好的解決了當神經網絡層數過多出現的難以訓練的問題,它創造性的設計了跳躍連接的方式,使得卷積神經網絡的層數出現了大幅度提升,設置可以達到上千層,可以說resnet對于網絡模型的設計具…

大模型巔峰對決:DeepSeek vs GPT-4/Claude/PaLM-2 全面對比與核心差異揭秘

文章目錄 一、架構設計深度解剖1.1 核心架構對比圖譜1.2 動態MoE架構實現架構差異分析表 二、訓練策略全面對比2.1 訓練數據工程對比2.2 分布式訓練代碼對比DeepSeek混合并行實現GPT-4 Megatron實現對比 2.3 關鍵訓練參數對比 三、性能表現多維評測3.1 基準測試全景對比3.2 推理…

基于hive的電信離線用戶的行為分析系統

標題:基于hive的電信離線用戶的行為分析系統 內容:1.摘要 隨著電信行業的快速發展&#xff0c;用戶行為數據呈現出海量、復雜的特點。為了深入了解用戶行為模式&#xff0c;提升電信服務質量和精準營銷能力&#xff0c;本研究旨在構建基于 Hive 的電信離線用戶行為分析系統。通…

Python使用alembic實現數據庫管理

python使用alembic實現數據庫管理 環境準備 安裝依賴&#xff1a; pip install sqlalchemy alembic項目結構 my_project/ ├── models.py # 定義數據模型 └── alembic/ # 遷移腳本目錄&#xff08;自動生成&#xff09; 使用步驟&#xff1a; 1. 初始化Alembic環境 …

對WebSocket做一點簡單的理解

1.概念 WebSocket 是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要完成一次握手&#xff0c;兩者之間就可以創建持久性的連接&#xff0c; 并進行雙向數據傳輸。 HTTP協議和WebSocket協議對比&#xff1a; HTTP是短連接 WebSocke…

kali虛擬機登錄頁面發癲 大寫鎖定輸入不了密碼

不知道怎么了 總是發癲 重啟切換太麻煩了 還有時候不成功 kali其實可以開啟虛擬鍵盤 如下 就解決的 發癲kali 發癲 發癲

基于Python的商品銷量的數據分析及推薦系統

一、研究背景及意義 1.1 研究背景 隨著電子商務的快速發展&#xff0c;商品銷售數據呈現爆炸式增長。這些數據中蘊含著消費者行為、市場趨勢、商品關聯等有價值的信息。然而&#xff0c;傳統的數據分析方法難以處理海量、多源的銷售數據&#xff0c;無法滿足現代電商的需求。…

內存泄漏出現的時機和原因,如何避免?

由于時間比較緊張我就不排版了&#xff0c;但是對于每一種可能的情況都會出對應的代碼示例以及解決方案代碼示例。 內存泄漏可能的原因之一在于用戶在動態分配一個內存空間之中&#xff0c;忘記將這部分內容手動釋放。例如&#xff1a;&#xff08;c之中使用new分配內存沒有使…

PDF處理控件Aspose.PDF,如何實現企業級PDF處理

PDF處理為何成為開發者的“隱形雷區”&#xff1f; “手動調整200頁PDF目錄耗時3天&#xff0c;掃描件文字識別錯誤導致數據混亂&#xff0c;跨平臺渲染格式崩壞引發客戶投訴……” 作為開發者&#xff0c;你是否也在為PDF處理的復雜細節消耗大量精力&#xff1f;Aspose.PDF憑…

工程化與框架系列(27)--前端音視頻處理

前端音視頻處理 &#x1f3a5; 引言 前端音視頻處理是現代Web應用中的重要組成部分&#xff0c;涉及音頻播放、視頻處理、流媒體傳輸等多個方面。本文將深入探討前端音視頻處理的關鍵技術和最佳實踐&#xff0c;幫助開發者構建高質量的多媒體應用。 音視頻技術概述 前端音視…

2008-2024年中國手機基站數據/中國移動通信基站數據

2008-2024年中國手機基站數據/中國移動通信基站數據 1、時間&#xff1a;2008-2024年 2、來源&#xff1a;OpenCelliD 3、指標&#xff1a;網絡類型、網絡代數、移動國家/地區、移動網絡代碼、區域代碼、小區標識、單元標識、坐標經度、坐標緯度、覆蓋范圍、測量樣本數、坐標…

阿里云 ESA 游戲行業解決方案|安全防護、加速、低延時的技術融合

如今&#xff0c;游戲行業正處于蓬勃發展與深刻變革的關鍵時期。根據中國國際數字娛樂產業大會&#xff08;CDEC&#xff09;發布的《2024年 1-6 月中國游戲產業報告》顯示 2024 年上半年國內游戲市場實際銷售收入達 1472.67 億元&#xff0c;同比增長 2.08%&#xff0c;游戲用…

C# Unity 唐老獅 No.7 模擬面試題

本文章不作任何商業用途 僅作學習與交流 安利唐老獅與其他老師合作的網站,內有大量免費資源和優質付費資源,我入門就是看唐老師的課程 打好堅實的基礎非常非常重要: 全部 - 游習堂 - 唐老獅創立的游戲開發在線學習平臺 - Powered By EduSoho 如果你發現了文章內特殊的字體格式,…

electron + vue3 + vite 主進程到渲染進程的單向通信

用示例講解下主進程到渲染進程的單向通信 初始版本項目結構可參考項目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主進程到渲染進程&#xff08;單向&#xff09; 以Electron官方文檔給出的”主進程主動觸發動作&#xff0c;發送內容給渲…