SpringBoot自定義實體類字段的校驗注解

在Spring Boot項目中,我們經常需要對請求參數進行格式或業務規則的校驗。雖然Spring Boot提供了如@NotNull、@Size等基礎校驗注解,但在實際開發中往往無法滿足復雜的業務需求。但是在Controller層寫大量的 if 語句的判斷邏輯又實在不優雅,好在 Spring Validator 為我們提供了一種自定義校驗注解的方法實現優雅的參數校驗。

簡而言之,自定義校驗注解的優點大概有以下幾點:

  • 統一性:避免在Controller層寫大量if判斷邏輯
  • 可復用性:可以在多個字段或多個實體類中重復使用
  • 可維護性:校驗邏輯和業務邏輯分離,便于后期修改和擴展

自定義校驗注解的實現步驟:

一、 創建自定義注解類
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidN1Validator.class)
public @interface ValidN1 {String message() default "必須1位數字";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

解析

1.?@Target({ElementType.FIELD, ElementType.PARAMETER}):表示該注解可以用于字段或方法參數上。例如,你可以標注在實體類字段上,也可以用在Controller方法的參數上。

2.?@Retention(RetentionPolicy.RUNTIME):表示該注解在運行時依然可用,這樣Spring才能在運行時讀取并執行校驗邏輯。

3.?@Constraint(validatedBy = ValidN1Validator.class):指定該注解由哪個校驗器來處理,這里是 ValidN1Validator 類。

4.?message():校驗失敗時返回的默認錯誤提示信息。

5.?groups():分組校驗使用,允許你根據不同的業務場景選擇性地啟用某些校驗規則。

6.?payload():可選屬性,通常用于攜帶額外元數據,如嚴重級別等。

二、實現對應的校驗器類
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class ValidN1Validator implements ConstraintValidator<ValidN1, Integer> {@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {if(value == null){return true;}if(value >= 0 && value <= 9){return true;}else {return false;}}
}

解析

1. 接口實現:ConstraintValidator<ValidN1, Integer>

  • ? ? ? ? 第一個泛型參數是注解類型;
  • ? ? ? ? 第二個泛型參數是要校驗的數據類型,這里是Integer。?

2. 方法實現:isValid(Integer value, ConstraintValidatorContext context)

  • ????????核心校驗邏輯,判斷傳入的值是否符合要求。
三、在實體類中添加注解
public class User {private String name;@ValidN1private Integer sex;
}
四、統一返回錯誤信息(可選)

為了統一返回錯誤信息,我們可以使用 @RestControllerAdvice 來捕獲校驗異常。

@RestControllerAdvice
@Slf4j
public class ValidationExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<RequestDto> handleValidationExceptions(MethodArgumentNotValidException ex) {BindingResult result = ex.getBindingResult();List<String> errors = result.getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.toList());RequestDto dto = new RequestDto();dto.setCode(-1);dto.setMessage("參數校驗失敗:" + errors);return ResponseEntity.badRequest().body(dto);}
}

這樣當用戶傳入非法參數時,系統會返回類似如下格式的響應:

{"code": -1,"message": "參數校驗失敗:[時間戳格式錯誤]"
}

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

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

相關文章

實現單例模式的6種方法(Python)

目錄 一. 基于模塊的實現(簡單&#xff0c;易用) 二. 重新創建時報錯(不好用) 三. 只靠方法獲取實例(不好用) 四. 類裝飾器 五. 重寫__new__方法 六. 元類 七. 總結 單例模式&#xff08;Singleton Pattern&#xff09;是一種設計模式&#xff0c;其核心目標是確保一個類…

循環神經網絡(RNN)全面教程:從原理到實踐

循環神經網絡(RNN)全面教程&#xff1a;從原理到實踐 引言 循環神經網絡(Recurrent Neural Network, RNN)是處理序列數據的經典神經網絡架構&#xff0c;在自然語言處理、語音識別、時間序列預測等領域有著廣泛應用。本文將系統介紹RNN的核心概念、常見變體、實現方法以及實際…

使用Vditor將Markdown文檔渲染成網頁(Vite+JS+Vditor)

1. 引言 編寫Markdown文檔現在可以說是程序員的必備技能了&#xff0c;因為Markdown很好地實現了內容與排版分離&#xff0c;可以讓程序員更專注于內容的創作。現在很多技術文檔&#xff0c;博客發布甚至AI文字輸出的內容都是以Markdown格式的形式輸出的。那么&#xff0c;Mar…

Day 40

單通道圖片的規范寫法 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset from torchvision import datasets, transforms import matplotlib.pyplot as plt import warnings warnings.filterwarnings(&q…

SPSS跨域分類:自監督知識+軟模板優化

1. 圖1:SPSS方法流程圖 作用:展示了SPSS方法的整體流程,從數據預處理到模型預測的關鍵步驟。核心內容: 領域知識提取:使用三種詞性標注工具(NLTK、spaCy、TextBlob)從源域和目標域提取名詞或形容詞(如例句中提取“excellent”“good”等形容詞)。詞匯交集與聚類:對提…

2025年通用 Linux 服務器操作系統該如何選擇?

2025年通用 Linux 服務器操作系統該如何選擇&#xff1f; 服務器操作系統的選擇對一個企業IT和云服務影響很大&#xff0c;主推的操作系統在后期更換的成本很高&#xff0c;而且也有很大的遷移風險&#xff0c;所以企業在選擇服務器操作系統時要尤為重視。 之前最流行的服務器…

如何在 Django 中集成 MCP Server

目錄 背景說明第一步&#xff1a;使用 ASGI第二步&#xff1a;修改 asgi.py 中的應用第三步&#xff1a;Django 數據的異步查詢 背景說明 有幾個原因導致 Django 集成 MCP Server 比較麻煩 目前支持的 MCP 服務是 SSE 協議的&#xff0c;需要長連接&#xff0c;但一般來講 Dj…

天拓四方工業互聯網平臺賦能:地鐵電力配電室綜合監控與無人巡檢,實現效益與影響的雙重顯著提升

隨著城市化進程的不斷加快&#xff0c;城市軌道交通作為緩解交通壓力、提升出行效率的重要方式&#xff0c;在全國各大城市中得到了迅猛發展。地鐵電力配電室作為核心供電設施&#xff0c;其基礎設施的安全性、穩定性和智能化水平也面臨更高要求。 本文將圍繞“工業物聯網平臺…

算法打卡第11天

36.有效的括號 &#xff08;力扣20題&#xff09; 示例 1&#xff1a; **輸入&#xff1a;**s “()” **輸出&#xff1a;**true 示例 2&#xff1a; **輸入&#xff1a;**s “()[]{}” **輸出&#xff1a;**true 示例 3&#xff1a; **輸入&#xff1a;**s “(]”…

python 包管理工具uv

uv --version uv python find uv python list export UV_DEFAULT_INDEX"https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" # 換成私有的repo export UV_HTTP_TIMEOUT120 uv python install 3.12 uv venv myenv --python 3.12 --seed uvhttps://docs.ast…

spring的多語言怎么實現?

1.創建springboot項目&#xff0c;并配置application.properties文件 spring.messages.basenamemessages spring.messages.encodingUTF-8 spring.messages.fallback-to-system-localefalsespring.thymeleaf.cachefalse spring.thymeleaf.prefixclasspath:/templates/ spring.t…

JAVA:Kafka 消息可靠性詳解與實踐樣例

?? 1、簡述 Apache Kafka 是高吞吐、可擴展的流處理平臺,在分布式架構中廣泛應用于日志采集、事件驅動和微服務解耦場景。但在使用過程中,消息是否會丟?何時丟?如何防止丟? 是很多開發者關心的問題。 Kafka 提供了一套完整的機制來保障消息從生產者 ? Broker ? 消費…

【AI非常道】二零二五年五月,AI非常道

經常在社區看到一些非常有啟發或者有收獲的話語&#xff0c;但是&#xff0c;往往看過就成為過眼云煙&#xff0c;有時再想去找又找不到。索性&#xff0c;今年開始&#xff0c;看到好的言語&#xff0c;就記錄下來&#xff0c;一月一發布&#xff0c;亦供大家參考。 前面的記…

C++哈希

一.哈希概念 哈希又叫做散列。本質就是通過哈希函數把關鍵字key和存儲位置建立映射關系&#xff0c;查找時通過這個哈希函數計算出key存儲的位置&#xff0c;進行快速查找。 上述概念可能不那么好懂&#xff0c;下面的例子可以輔助我們理解。 無論是數組還是鏈表&#xff0c;查…

iOS 使用CocoaPods 添加Alamofire 提示錯誤的問題

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把這個改成 no 2 設置配置文件

mysql的Memory引擎的深入了解

目錄 1、Memory引擎介紹 2、Memory內存結構 3、內存表的鎖 4、持久化 5、優缺點 6、應用 前言 Memory 存儲引擎 是 MySQL 中一種高性能但非持久化的存儲方案&#xff0c;適合臨時數據存儲和緩存場景。其核心優勢在于極快的讀寫速度&#xff0c;需注意數據丟失風險和內存占…

若依項目AI 助手代碼解析

基于 Vue.js 和 Element UI 的 AI 助手組件 一、組件整體結構 這個 AI 助手組件由三部分組成&#xff1a; 懸浮按鈕&#xff1a;點擊后展開 / 收起對話窗口對話窗口&#xff1a;顯示歷史消息和輸入框API 調用邏輯&#xff1a;與 AI 服務通信并處理響應 <template><…

Vue2的diff算法

diff算法的目的是為了找出需要更新的節點&#xff0c;而未變化的節點則可以復用 新舊列表的頭尾先互相比較。未找到可復用則開始遍歷&#xff0c;對比過程中指針逐漸向列表中間靠攏&#xff0c;直到遍歷完其中一個列表 具體策略如下&#xff1a; 同層級比較 Vue2的diff算法只…

mongodb集群之分片集群

目錄 1. 適用場景2. 集群搭建如何搭建搭建實例Linux搭建實例(待定)Windows搭建實例1.資源規劃2. 配置conf文件3. 按順序啟動不同角色的mongodb實例4. 初始化config、shard集群信息5. 通過router進行分片配置 1. 適用場景 數據量大影響性能 數據量大概達到千萬級或億級的時候&…

DEEPSEEK幫寫的STM32消息流函數,直接可用.已經測試

#include "main.h" #include "MessageBuffer.h"static RingBuffer msgQueue {0};// 初始化隊列 void InitQueue(void) {msgQueue.head 0;msgQueue.tail 0;msgQueue.count 0; }// 檢查隊列狀態 type_usart_queue_status GetQueueStatus(void) {if (msgQ…