Validation - Spring Boot項目中參數檢驗的利器

Validation - Spring Boot項目中參數檢驗的利器

什么是Validation

Sping Boot官方原文:

When it comes to validating user input, Spring Boot provides strong support for this common, yet critical, task straight out of the box.

Although Spring Boot supports seamless integration with custom validators, the de-facto standard for performing validation is Hibernate Validator, the Bean Validation framework’s reference implementation.

Validation是Spring Boot官方提供的一個參數檢驗的工具,通常負責驗證用戶輸入,也就是在從前端獲取請求時對請求中包含的信息參數進行檢驗,避免了進入后端檢驗這個流程的耗時與邏輯編寫

為什么要使用Validation

Validation在Spring Boot架構的分布式項目當中比較常見,其優點我總結為:

  • 與后端邏輯分離,做到了解耦
  • 使用簡單,只需要在需要進行參數檢驗的參數(DTO層)上增加一個注釋即可,不需要編寫大量接口和實現代碼
  • 官方支持,使用穩定

接下來我們將通過前兩個角度來看看Validation是怎樣簡單上手使用的,我將使用我的學習項目作為示例

如何使用Validation

在一種情況下,比如我們設計數據庫表的時候,往往會有一些字段包含實際意義,比如郵箱或電話號碼,這些字段與分配的隨機id不同,在現實中有一定的規范;另一種情況下,比如我們的用戶設置初始密碼時,我們也通常會要求用戶至少輸入6位,有時還會要求至少有一位大寫字母等,這時我們就需要對用戶輸入的數據進行檢驗,檢查這些數據是否符合實際規范或者我們的要求,此時就可以用上Validation

比如在我的項目中,作為一個電商平臺,有用戶表如下:

public class User {private Long id;private String username;private String password;private String phone;private String email;private Date registerTime;private Integer status;private String realName;private String address;
}

電商平臺會出現用戶注冊的場景,于是我們就要定義用戶注冊時返回的數據的DTO類

public class UserRegisterDTO {@NotBlank(message = "用戶名不能為空")private String username;@NotBlank(message = "密碼不能為空")@Size(message = "密碼長度至少為6", min = 6)private String password;@NotBlank(message = "電話號碼不能為空")@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機號格式不正確")private String phone;@NotBlank(message = "郵箱不能為空")@Email(message = "郵箱格式不正確")private String email;
}

在注冊時,我們就需要規范用戶輸入的這些信息,所有信息都是必要的不能為空,同時密碼有長度限制,電話號碼有其固定格式,郵箱同理,我們在這里就可以通過Validation的注釋來告訴系統,在把用戶返回的這些數據包裝成對應的DTO類時,需要進行檢查

再具體一點,我們怎么通知系統呢

首先我們需要添加依賴,比如我的項目中:

        <dependency><groupId>jakarta.validation</groupId><artifactId>jakarta.validation-api</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

我做的是一個微服務項目,目前上述的代碼都位于用戶模塊,因此這個依賴我也是添加在我用戶模塊的子pom中,有了這個依賴,我們就可以開始使用Validation

接著我們需要在對應的API中聲明,告訴系統我們在處理這個請求之前需要對其參數進行檢驗,比如我注冊的Restful API:

    // 注冊用戶@PostMapping("/register")public Result<Boolean> register(@Valid @RequestBody UserRegisterDTO dto) {return userService.register(dto) ?Result.ok(true) :Result.fail("Register Failed");}

只有在這里指明了@Valid這個注釋,系統才會對其進行Validation相關處理

接著我們就要進一步對參數進行注釋,正如我之前給出的代碼,在DTO層對應的參數前添加相應的注釋即可,一般來說,validation注釋有以下幾種:

  • @AssertFalse:被注解的元素必須為false
  • @AssertTrue:被注解的元素必須為true
  • @DecimalMax(value):被注解的元素必須是一個數字,其值必須小于等于指定的最大值
  • @DecimalMin(value):被注解的元素必須是一個數字,其值必須大于等于指定的最小值
  • @Digits(integer, fraction):被注解的元素必須是一個數字,其值必須在可接受的范圍內
  • @Future:被注解的元素必須是一個將來的日期
  • @Max(value):被注解的元素必須是一個數字,其值必須小于等于指定的最大值
  • @Min(value):被注解的元素必須是一個數字,其值必須大于等于指定的最小值
  • @NotNull:被注解的元素必須不為null
  • @Null:被注解的元素必須為null
  • @Past:被注解的元素必須是一個過去的日期
  • @Pattern(regex, flag):被注解的元素必須符合指定的正則表達式
  • @Size(min, max):被注解的元素的大小必須在指定的范圍內
  • @Email:被注解的元素必須是電子郵件地址
  • @NotEmpty:被注解的元素不能為null,并且長度必須大于0
  • @NotBlank:被注解的元素為字符串,并且被trim()以后length要大于0
  • @Range(min, max):被注解的元素必須在合適的范圍內
  • @URL:被注解的元素必須是一個有效的URL

在元素之前添加相應的注釋,項目啟動后,把用戶返回的參數包裝成DTO類對象時就會進行檢查

但是只檢查出來了,最多也就會返回400的錯誤代碼,前端只是了解到有錯誤,但是無法對錯誤進行定位,于是此時我們就需要進一步處理

自定義Result類,用來統一管理前端請求的處理結果

public class Result<T> {private Integer code;private String msg;private T data;public static <T> Result<T> ok(T data) {Result<T> r = new Result<>();r.setCode(200);r.setMsg("success");r.setData(data);return r;}public static <T> Result<T> fail(String msg) {Result<T> r = new Result<>();r.setCode(500);r.setMsg(msg);return r;}
}

自定義異常處理類,用于對運行時錯誤進行處理

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Result<?> handleValidationException(MethodArgumentNotValidException ex) {String errorMsg = ex.getBindingResult().getFieldError().getDefaultMessage();return Result.fail(errorMsg);}
}

有了這兩段代碼,項目啟動后就有了自定義的對運行時錯誤進行定位處理的能力,比如用戶注冊時輸入的初始密碼小于6位,通過Validation注釋檢查出了這一錯誤,然后匯報給GlobalExceptionHandler類,它就將錯誤信息包裝,并最終包裝成Result類,返回給前端,這樣前端就能看見具體的錯誤信息,比如我測試如下:

我在Postman中進行用戶注冊測試,這是注冊的body json部分:

{"username": "testValid6","password": "five","email": "12345678","phone": "12345678"
}

最后返回了結果:

{"timestamp": "2025-07-19T04:59:28.091+00:00","status": 400,"error": "Bad Request","trace": 略"message": "Validation failed for object='userRegisterDTO'. Error count: 3","errors": [{"codes": ["Email.userRegisterDTO.email","Email.email","Email.java.lang.String","Email"],"arguments": [{"codes": ["userRegisterDTO.email","email"],"arguments": null,"defaultMessage": "email","code": "email"},[],{"arguments": null,"defaultMessage": ".*","codes": [".*"]}],"defaultMessage": "郵箱格式不正確","objectName": "userRegisterDTO","field": "email","rejectedValue": "12345678","bindingFailure": false,"code": "Email"},{"codes": ["Pattern.userRegisterDTO.phone","Pattern.phone","Pattern.java.lang.String","Pattern"],"arguments": [{"codes": ["userRegisterDTO.phone","phone"],"arguments": null,"defaultMessage": "phone","code": "phone"},[],{"arguments": null,"defaultMessage": "^1[3-9]\\d{9}$","codes": ["^1[3-9]\\d{9}$"]}],"defaultMessage": "手機號格式不正確","objectName": "userRegisterDTO","field": "phone","rejectedValue": "12345678","bindingFailure": false,"code": "Pattern"},{"codes": ["Size.userRegisterDTO.password","Size.password","Size.java.lang.String","Size"],"arguments": [{"codes": ["userRegisterDTO.password","password"],"arguments": null,"defaultMessage": "password","code": "password"},2147483647,6],"defaultMessage": "密碼長度至少為6","objectName": "userRegisterDTO","field": "password","rejectedValue": "five","bindingFailure": false,"code": "Size"}],"path": "/user/register"
}

可以看出,這里按照DTO設計的參數的順序,通通給出了錯誤的信息,這樣就能夠精準地定位錯誤,前端也就可以對其做相應的處理

總結

整體來說,Validation將原先需要一個API一個API編寫的參數檢驗邏輯簡化至如此方便,可以說是Spring Boot項目中官方提供的一個參數檢驗的利器了,對參數標注只需要注釋,錯誤處理可以統一編寫錯誤處理類,前端也可以清晰地看見具體的錯誤,能夠極大地簡化這部分邏輯的開發,省去繁瑣的重復性工作

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

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

相關文章

云服務器VS虛擬主機:如何抉擇?

開篇引入在當今數字化浪潮中&#xff0c;無論是個人站長想要搭建獨具風格的博客&#xff0c;展示自己的生活感悟與專業見解&#xff1b;還是中小企業期望構建官方網站&#xff0c;拓展線上業務版圖&#xff0c;提升品牌知名度&#xff1b;亦或是大型互聯網企業籌備高并發的電商…

不同相機CMOS噪點對熒光計算的影響

摘要&#xff1a;熒光成像是生物醫學、材料科學等領域的重要研究手段&#xff0c;其成像質量高度依賴傳感器噪聲特性。本文系統分析CMOS傳感器噪聲類型及其對熒光信號計算的影響機制&#xff0c;結合實驗數據探討不同CMOS架構的噪聲表現差異&#xff0c;提出針對性優化策略。研…

docker 常見命令使用記錄

1. swarm 集群 1. 集群創建 # 創建集群管理節點&#xff0c; --advertise-addr 指定節點管理通信地址&#xff0c;--data-path-addr 指定容器通信地址 docker swarm init --advertise-addr 1.14.138.35 --data-path-addr 1.14.138.35# --advertise-addr 指明當前work節點的…

KRaft 角色狀態設計模式:從狀態理解 Raft

這些狀態類是 Raft 協議行為的核心載體。它們包含轉移邏輯 和 節點在特定狀態下的所有行為和數據。QuorumState它是 KRaft 客戶端實現中狀態管理的核心&#xff0c;扮演著“狀態機上下文&#xff08;Context&#xff09;”和“狀態轉換協調者”的關鍵角色。QuorumState 是整個 …

Linux的磁盤存儲管理實操——(上)

一、Linux的設備文件分類 Linux的設備文件分類1、在Linux系統中設備文件是用來與外接交互的接口&#xff0c;它將內核中的硬件設備與文件系統關聯起來&#xff0c;讓用戶可以像操作普通文件一樣來操作硬件設備&#xff0c;同時也為開發者提供了方便而強大的應用程序接口。 2、L…

內核bpf的實現原理

bpftrace能幫我們干什么&#xff1f;1、統計 tcp連接的生命時長、2、統計mysql執行一條sql語句的時間3、統計redis執行命令的時間、 4、對文件進行一次讀或者寫的時間。 常用命令&#xff1a; bpftrace -e Begin { printf("hello\n"); } bpftrace -l *enter_accep…

前端npm配置Nexus為基礎倉庫

步驟&#xff1a; 一、Nexus倉庫配置 新增npm倉庫,具體詳解見 Nexus私有倉庫配置&#xff0c;解釋 注&#xff1a;Nexus的版本需要至少3.38以上&#xff0c;不然會出現npm install 時npm的審計功能報錯&#xff0c;導致install失敗。雖然在3.38以后不會報400錯誤&#xff0c…

數據結構 之 【排序】(直接插入排序、希爾排序)

目錄 1.直接插入排序 1.1直接插入排序的思想 1.2直接插入排序的代碼邏輯&#xff1a; 1.3 直接插入排序圖解 1.4單趟排序代碼(單個元素的排序邏輯) 1.5完整排序代碼 1.6直接插入排序的時間復雜度與空間復雜度 1.7直接插入排序的優勢 2.希爾排序(縮小增量排序) 2.1…

Laravel 后臺登錄 403 Forbidden 錯誤深度解決方案-優雅草卓伊凡|泡泡龍

Laravel 后臺登錄 403 Forbidden 錯誤深度解決方案-優雅草卓伊凡|泡泡龍一頓操作猛如虎&#xff0c;一看結果250&#xff0c;必須記錄&#xff0c;必須記錄&#xff0c;&#xff01;今天弄了很久關于我們2023年的產品系統蜻蜓T會議系統專業版&#xff0c;然后終于搞好了密碼也重…

Newline全場景方案閃耀2025中國智慧生活大會

7月15日 — 16日&#xff0c;由中國電子視像行業協會等權威機構指導的2025 CIC中國智慧生活大會在京召開。Newline作為視像協會PID分會副會長單位攜全場景智慧辦公解決方案亮相&#xff0c;首席營銷官李宇鵬受邀出席領袖圓桌環節&#xff0c;與騰訊云、京東方、創維、TCL、小猿…

Edge瀏覽器地址欄默認搜索引擎設置指南

前言 Microsoft Edge 瀏覽器允許用戶自定義地址欄默認搜索引擎&#xff0c;只是設置入口隱藏比較深&#xff0c;以版本 137.0.3296.83 (正式版本) (64 位)為例詳細記錄設置地址欄默認搜索引擎步驟&#xff1a; Edge 設置默認搜索引擎步驟 通過設置界面修改 打開Edge設置&#x…

Python eval函數詳解 - 用法、風險與安全替代方案

Python eval函數詳解 - 用法、風險與安全替代方案在Python中&#xff0c;eval() 是一個內置函數&#xff0c;用于解析并執行傳入的字符串形式的表達式。它能夠將字符串動態地轉換為有效的Python代碼并運行。雖然 eval() 功能強大&#xff0c;但其使用也伴隨著潛在的安全風險。本…

Webpack5 新特性與詳細配置指南

一、Webpack5 新特性 內置 Asset Modules&#xff08;資源模塊&#xff09; 替代 file-loader、url-loader、raw-loader 等&#xff0c;統一資源處理方式。四種類型&#xff1a;asset/resource&#xff1a;導出文件 URL&#xff08;等同 file-loader&#xff09;。asset/inli…

籠子在尋找一只鳥:解讀生活的隱形陷阱

想象一個閃閃發光的籠子&#xff0c;敞開著門&#xff0c;在世界中游蕩&#xff0c;尋找一只鳥兒。這畫面是不是有點奇怪&#xff1f;這是卡夫卡的格言“一個籠子在尋找一只鳥”帶給我們的奇思妙想。通常&#xff0c;鳥兒自由翱翔&#xff0c;籠子靜靜等待&#xff0c;但卡夫卡…

低空經濟展 | 約克科技攜小型化測試設備亮相2025深圳eVTOL展

全球低空經濟與eVTOL產業盛會——2025深圳eVTOL展&#xff0c;將于2025年9月23日至25日在深圳坪山燕子湖國際會展中心盛大啟幕&#xff01; 本屆展會以“低空經濟eVTOL航空應急救援商載大型無人運輸機”為核心&#xff0c;預計匯聚200位發言嘉賓、500家頂尖展商及15,000位專業觀…

數學專業轉行做大數據容易嗎?需要補什么?

高考志愿選擇數學專業是一個面向未來的決定。數學作為基礎學科&#xff0c;其嚴謹的邏輯訓練和抽象思維能力培養&#xff0c;為后續專業發展提供了廣泛的可能性。在數字化時代背景下&#xff0c;數學專業畢業生在數據科學、人工智能等領域的競爭優勢明顯。大學期間推薦考CDA數據…

物聯網系統中-設備管理定義方法

物聯網系統中的設備管理是指對聯網物理設備進行全生命周期監控、配置、維護和優化的系統性過程。它涵蓋了從設備接入到退役的各個環節&#xff0c;是物聯網平臺的核心能力&#xff0c;確保設備安全、穩定、高效地運行并產生價值。 以下是設備管理的詳細定義與核心組成部分&…

java和ptyhon對比

&#x1f4dd; ?1. 語言特性對比??維度??Java??Python??語法風格?靜態類型&#xff0c;需顯式聲明變量類型&#xff1b;代碼冗長&#xff08;需分號、大括號&#xff09;動態類型&#xff0c;變量類型自動推斷&#xff1b;簡潔&#xff08;縮進代替大括號&#xff0c…

UI測試解決方案TestComplete:助力小團隊端到端測試全覆蓋

面對軟件多平臺部署的復雜環境與有限的人力資源&#xff0c;小團隊在追求端到端測試覆蓋時常常陷入困境&#xff1a;既要確保應用在Windows、macOS、Linux及iOS、Android等碎片化平臺上的穩定兼容&#xff0c;又要應對腳本重復編寫耗時費力、測試效率低下的挑戰&#xff0c;同時…

【Android】事件、繪制坐標系相關

一&#xff0c;事件坐標系即MotionEvent事件下發的坐標系&#xff0c;其坐標軸如下MotionEvent#offsetLocation方法可調整坐標原點&#xff0c;以影響MotionEvent#getX&#xff0c;MotionEvent#getY值&#xff0c;以匹配子View的坐標參考系&#xff0c;進而進行事件處理。注意&…