活到老學到老-Spring參數校驗注解Validated /Valid

通過?@Validated?和?@Valid可以對請求的進行參數校驗。

1.核心對比:

特性@Valid?(JSR-303)@Validated?(Spring)
來源Java標準規范Spring框架擴展
分組校驗不支持支持(通過groups屬性)
嵌套路徑自動處理級聯校驗需配合@Valid生效
應用范圍方法參數、屬性、返回值類、方法、參數
List校驗需放在集合聲明處需配合@Valid生效

2.基礎使用示例

?2.1 單對象校驗

public class UserDTO {@NotBlank(message = "用戶名不能為空")private String username;@Email(message = "郵箱格式錯誤")private String email;
}// 使用@Valid
@PostMapping("/users")
public Result createUser(@RequestBody @Valid UserDTO user) {// ...
}// 使用@Validated
@RestController
@Validated // 類級別啟用校驗
public class UserController {@PostMapping("/users")public Result createUser(@RequestBody @Validated UserDTO user) {// ...}
}

3. 級聯屬性校驗

3.1 嵌套對象校驗
public class OrderDTO {@NotNullprivate Long orderId;@Valid // 關鍵注解,啟用嵌套校驗private UserDTO user;
}// 測試
@PostMapping("/orders")
public Result createOrder(@RequestBody @Valid OrderDTO order) {// 會自動校驗order.user里的約束
}
3.2 集合元素校驗
public class BatchRequest {@Size(min = 1, max = 10)private List<@Valid UserDTO> users; // 校驗每個元素
}@PostMapping("/batch")
public Result batchCreate(@RequestBody @Valid BatchRequest request) {// 會校驗list內每個UserDTO
}

4. 分組校驗(僅@Validated支持)

4.1 定義校驗分組
public interface CreateCheck {}
public interface UpdateCheck {}public class ProductDTO {@Null(groups = CreateCheck.class) // 創建時ID必須為空@NotNull(groups = UpdateCheck.class) // 更新時ID不能為空private Long id;@NotBlank(groups = {CreateCheck.class, UpdateCheck.class})private String name;
}
4.2 使用分組
@PostMapping("/products")
public Result create(@RequestBody @Validated(CreateCheck.class) ProductDTO product) {// 僅觸發CreateCheck組的校驗
}@PutMapping("/products/{id}")
public Result update(@PathVariable Long id, @RequestBody @Validated(UpdateCheck.class) ProductDTO product) {// 僅觸發UpdateCheck組的校驗
}

5.統一異常處理

@RestControllerAdvice
public class GlobalExceptionHandler {// 處理@Validated和@Valid拋出的異常@ExceptionHandler(MethodArgumentNotValidException.class)public Result handleValidException(MethodArgumentNotValidException e) {List<String> errors = e.getBindingResult().getFieldErrors().stream().map(error -> error.getField() + ": " + error.getDefaultMessage()).collect(Collectors.toList());return Result.fail(400, "參數錯誤", errors);}
}

6.最佳實現

6.1 混合使用
類/方法級用 @Validated參數/屬性級用 @Valid
6.2 性能優化
// 避免在循環中校驗
@Validated
@Service
public class UserService {public void batchProcess(@Valid List<UserDTO> users) {// 批量處理}
}
6.3 自定義校驗
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {String message() default "手機號格式錯誤";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
6.4 復雜場景
// 級聯校驗+集合校驗
public class DepartmentDTO {@Validprivate List<@Valid EmployeeDTO> employees;@Validprivate AddressDTO location;
}

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

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

相關文章

【筆記】JetBrains 數據遷移與符號鏈接操作

數據遷移與符號鏈接操作 一、備份原始數據 使用 robocopy 命令備份 C 盤中的源文件夾&#xff0c;確保原始數據完整備份。 robocopy "C:\Users\love\AppData\Local\JetBrains" "E:\Downloads\Other\JetBrains" /E確保備份路徑足夠存儲空間。 二、復制文…

使用 Terraform 創建 Azure Databricks 工作區

使用 Terraform 創建 Azure Databricks Terraform 是一種基礎設施即代碼(IaC)工具,允許用戶通過聲明式配置文件來管理和部署云資源。Azure Databricks 是一個基于 Apache Spark 的分析平臺,專為數據工程和數據科學設計。通過 Terraform,可以自動化 Azure Databricks 的創…

【zookeeper】--部署3.6.3

文章目錄 下載解壓創建data和logs配置文件1)創建目錄并且編輯 zoo.cfg2)接下來將 node01 的 ZooKeeper 所有文件拷貝至 node02 和 node03。推薦從 node02 和 node03 拷貝4&#xff09;最后 vim /etc/profile 配置環境變量&#xff0c;環境搭建結束。配完環境變量后 source /etc…

RxJS 核心操作符詳細用法示例

1. Observable 詳細用法 Observable 是 RxJS 的核心概念&#xff0c;代表一個可觀察的數據流。 創建和訂閱 Observable import { Observable } from "rxjs";// 1. 創建Observable const myObservable new Observable(subscriber > {// 發出三個值subscriber.n…

QGrphicsScen畫布網格和QGrphicsItem對齊到網格

#include <QGraphicsScene> #include <QPainter> #include <QWheelEvent> #include <QGraphicsView> class MyGraphicsView : public QGraphicsView { public:MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene){}protected:// 重寫滾輪事…

深入解析自然語言處理中的語言轉換方法

在數字化浪潮席卷全球的今天&#xff0c;自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;作為人工智能領域的核心技術之一&#xff0c;正深刻地改變著我們與機器交互的方式。其中&#xff0c;語言轉換方法更是 NLP 的關鍵組成部分&#xff0c…

VRRP虛擬路由器協議的基本概述

目錄 vrrp是什么&#xff1f; VRRP的一些概念與專有名詞 VRRP的Master選舉規則&#xff1a; 尾聲 vrrp是什么&#xff1f; vrrp全名virtual router redundance protocol&#xff0c;虛擬路由器冗余協議 VRRP的一些概念與專有名詞 1&#xff09;VRRP設備&#xff1a;運行VRRP…

數據結構 -- 交換排序(冒泡排序和快速排序)

冒泡排序 基于“交換”的排序&#xff1a;根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置 //交換 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …

多模態AI終極形態?GPT-5與Stable Diffusion 3的融合實驗報告

多模態AI終極形態&#xff1f;GPT-5與Stable Diffusion 3的融合實驗報告 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 多模態AI終極形態&#xff1f;GPT-5與Stable Diffusion 3的融合實驗報告摘要引言技術架構對…

ajax中get和post的區別,datatype返回的數據類型有哪些?

GET 請求 和 POST 請求 是 HTTP 協議中常用的兩種請求方法&#xff0c;它們主要的區別在于&#xff1a; GET 請求&#xff1a; 數據傳輸方式&#xff1a;數據通過 URL 傳遞&#xff0c;通常是附加在 URL 后面的查詢字符串中&#xff0c;例如 https://example.com/page?nameJoh…

101 alpha_59

(0 - (1 * (rank((sum(returns, 10) / sum(sum(returns, 2), 3))) * rank((returns * cap))))) 0 - (1 * A * B) A rank((sum(returns, 10) / sum(sum(returns, 2), 3)))B rank((returns * cap)) sum(returns, 10)&#xff1a;計算過去 10 期收益率的總和sum(returns, 2)&…

vscode里幾種程序調試配置

標題調試python嵌入的c代碼,例如 import torch from torch.utils.cpp_extension import loadtest_load load(nametest_load, sources[test.cpp],extra_cflags[-O0, -g],#extra_cflags[-O1],verboseTrue, ) a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6]) result te…

深入解析MySQL中的HAVING關鍵字:從入門到實戰

引言 在SQL查詢中&#xff0c;數據過濾是核心操作之一。我們常用WHERE子句進行行級過濾&#xff0c;但當需要對分組后的結果進行條件篩選時&#xff0c;HAVING關鍵字便成為不可或缺的工具。本文將深入探討HAVING的作用、使用場景及其與WHERE的區別&#xff0c;并通過實際案例幫…

根據YOLO數據集標簽計算檢測框內目標面積占比(YOLO7-10都適用)

程序&#xff1a; 路徑改成自己的&#xff0c;閾值可以修改也可以默認 #zhouzhichao #25年5月17日 #計算時頻圖中信號面積占檢測框面積的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…

AI神經網絡降噪 vs 傳統單/雙麥克風降噪的核心優勢對比

1. 降噪原理的本質差異 對比維度傳統單/雙麥克風降噪AI神經網絡降噪技術基礎基于固定規則的信號處理&#xff08;如譜減法、維納濾波&#xff09;基于深度學習的動態建模&#xff08;DNN/CNN/Transformer&#xff09;噪聲樣本依賴預設有限噪聲類型訓練數據覆蓋數十萬種真實環境…

了解Android studio 初學者零基礎推薦(3)

kotlin中的數據類及對象 使用泛型創建可重復使用的類 我們將常在線答題考試&#xff0c;有的考試題型包括判斷&#xff0c;或者填空&#xff0c;以及數學題&#xff0c;此外試題內容還包括難易程度&#xff1a;"easy”,"medium"&#xff0c;"hard",…

【占融數科-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

記錄一次請求數據很慢的災難

起因&#xff1a; 因公司業務需要&#xff0c;對接了一個平臺的 api。對接完成之后&#xff0c;發現只要打開開關&#xff0c;就別的接口就訪問很慢&#xff0c;出現 gatway time out。 排查&#xff1a; 先看下主服務器和 slave 服務器的狀態&#xff1a; 主服務&#xff…

力扣-將x減到0的最小操作數

1.題目描述 2.題目鏈接 1658. 將 x 減到 0 的最小操作數 - 力扣&#xff08;LeetCode&#xff09; 3.題目分析 1&#xff09;正面求解困難 題目要求我們每次都從最左邊或者最右邊取一個數&#xff0c;使x-元素的值&#xff0c;并在數組中移除該元素。最后返回的最小操作數…

排序復習/上(C語言版)

目錄 1.排序概念 2.冒泡排序 效率性能測試代碼&#xff1a; 性能分析&#xff1a; 3.直接插入排序 單趟&#xff1a; 整體&#xff1a; 性能分析&#xff1a; 4.希爾排序&#xff08;基于插入排序的優化&#xff09; 單趟單組&#xff1a; 單趟多組&#xff1a; 降低…