spring boot3.0自定義校驗注解:文章狀態校驗示例

文章目錄

  • Spring Boot 自定義校驗注解:狀態校驗示例
  • 一、創建 `@State` 注解
    • 步驟:
      • 1. 創建自定義注解:
      • 2. 實現校驗邏輯:
  • 二、 實現自定義校驗
    • 步驟:
      • 1. 在實體類中使用自定義校驗注解 `@State`:
      • 2. 添加 `@State` 注解:
  • 總結
    • 主要步驟回顧:
    • 優勢

Spring Boot 自定義校驗注解:狀態校驗示例

本文詳細介紹如何在 Spring Boot 中自定義校驗注解,并以狀態校驗為例進行講解,力求簡潔明了,易于理解和實踐。

  • 在實際應用中,標準的注解校驗可能無法滿足所有需求,尤其是在處理一些特殊的校驗場景時。例如,可能需要根據業務邏輯對字段進行復雜的組合校驗,或是在運行時動態決定校驗規則。在這種情況下,使用現有的注解校驗就顯得力不從心。因此,我們可以通過自定義校驗注解,來實現更靈活和精確的校驗邏輯。這不僅能夠提高代碼的可讀性和可維護性,還能使我們的應用更好地應對各種復雜的業務需求。

下面是對“創建State注解”部分的創建以及教學


一、創建 @State 注解

在現有的 Spring Boot 項目中,我們可能需要實現一些業務特定的校驗邏輯,例如,確保一個字段的狀態值滿足特定條件。為此,我們可以創建一個自定義的 State 注解。這個注解將用于標識某個字段的狀態,并通過自定義的校驗邏輯來確保其值的合法性和有效性。

步驟:

1. 創建自定義注解:

在項目的合適位置(如 com.example.validation 包下),新建一個 State 注解類。該注解可以接收多個參數,例如允許的狀態值。

package com.YJZE.anno;import com.YJZE.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;import java.lang.annotation.*;@Documented//元注解
@Target( ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidation.class})
public @interface State {String message() default "state參數只能是草稿或者已發布";Class<?>[] groups() default {};//負載 獲取到State注解的附加信息Class<? extends Payload>[] payload() default {};
}

2. 實現校驗邏輯:

創建一個名為 StateValidator 的類, 實現 ConstraintValidator<State, String> 接口。在這個類中定義具體的校驗邏輯,以驗證字段的值是否在允許的狀態值中。

package com.YJZE.validation;import com.YJZE.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;public class StateValidation implements ConstraintValidator<State,String> {/**** @param s* @param constraintValidatorContext* @return*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if(s == null){return false;}if(s.equals("已發布") || s.equals("草稿")){return true;}return false;}
}

二、 實現自定義校驗

步驟:

1. 在實體類中使用自定義校驗注解 @State

在我們的實體類中,通常需要對某些字段添加約束,以確保它們的值符合業務邏輯的要求。為了應用我們剛剛創建的 @State 自定義注解,我們需要在需要進行狀態校驗的字段上添加此注解。

2. 添加 @State 注解:

在對應字段的聲明上面添加 @State 注解,指定合法的狀態值。例如,假設我們有一個 Article 實體類,其中有一個 status 字段,表示文章的狀態:

import com.YJZE.anno.State;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.URL;import java.time.LocalDateTime;@Data
public class Article {private Integer id;//主鍵ID@URLprivate String coverImg;//封面圖像@Stateprivate String state;//發布狀態 已發布|草稿@NotNullprivate Integer categoryId;//文章分類idprivate Integer createUser;//創建人IDprivate LocalDateTime createTime;//創建時間private LocalDateTime updateTime;//更新時間
}

總結

在本教程中,我們深入探討了如何在 Spring Boot 中創建和實現自定義校驗注解。通過自定義的 @State 注解,我們能夠根據具體的業務需求對字段狀態進行靈活而精確的校驗。這種方法不僅提升了代碼的可讀性和可維護性,還使得校驗邏輯更加清晰明了。

主要步驟回顧:

  1. 創建自定義注解:我們首先定義了 @State 注解,并使用 @Constraint 注解來標記其為校驗注解。此外,借助自定義的驗證器 StateValidation,實現了具體的校驗邏輯。

  2. 實現校驗邏輯:通過實現 ConstraintValidator 接口,定義了有效的狀態值(如 "已發布""草稿"),并在 isValid 方法中實現了相應的校驗機制,以確保字段值合法。

  3. 應用自定義校驗:在實體類中,我們將自定義注解應用于需要進行狀態校驗的字段。例如,在 Article 類中,對 state 字段使用了 @State 注解,從而保證其值符合預定義規則。

優勢

  • 靈活性:可根據具體業務需求靈活自定義校驗邏輯,滿足復雜場景的需要。
  • 可讀性:通過注解清晰表達校驗意圖,減少冗余的樣板代碼,增強代碼的可理解性。
  • 可維護性:集中化的校驗邏輯便于后續的修改和擴展,提高了代碼的可維護性。

通過學習和實踐自定義校驗注解,將能夠更有效地應對應用程序的復雜需求,提升整體代碼質量,并在復雜的業務場景中展現出更強的競爭力。希望這個示例能夠對你的項目有所幫助,如需深入了解,歡迎評論區隨時提問!

注意:

  • 如有錯誤請告知
  • 如有侵權請帶著截圖發郵件
  • 郵箱 1413229255@qq.com

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

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

相關文章

無侵入式彈窗體驗_探索 Chrome 的 Close Watcher API

1. 引言 在網頁開發中,彈窗(Popup)是一種常見的交互方式,用于提示用戶進行操作、確認信息或展示關鍵內容。然而,傳統的 JavaScript 彈窗方法如 alert()、confirm() 和 prompt() 存在諸多問題,包括阻塞主線程、樣式不可定制等。 為了解決這些問題,Chrome 瀏覽器引入了 …

調出事件查看器界面的4種方法

方法1. 方法2. 方法3. 方法4.

Ubuntu 安裝遠程桌面連接RDP方式

1. 安裝 XFCE4 桌面環境 如果你的 Ubuntu 系統默認使用 GNOME 或其它桌面環境&#xff0c;可以安裝輕量級的 XFCE4&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies 說明&#xff1a;xfce4-goodies 包含額外的插件和工具&#xff08;如面板插件、終端等&a…

LWIP傳輸層協議筆記

傳輸協議簡介 文件/圖片/視頻 都是一堆二進制數據 經過傳輸層來傳輸 這兩種協議有什么區別呢&#xff1f; 傳輸層的TCP/UDP三個步驟 TCP使用傳輸流程 1、三次握手 作用&#xff1a;三次握手就是建立連接的過程 2、傳輸數據 作用&#xff1a;建立連接完成之后&#xff…

數據分析與邏輯思維:六步解決業務難題;參考書籍《數據分析原理:6步解決業務分析難題 (周文全, 黃怡媛, 馬炯雄)》

文章目錄 一、懂業務&#xff1a;業務背景與邏輯前提1.1 明確業務目標與問題定義1.2 培養批判性思維與高于業務視角 二、定指標&#xff1a;構建科學的指標體系2.1 指標拆解與維度分析2.2 典型指標體系案例&#xff1a;用戶與業務視角 三、選方法&#xff1a;匹配業務需求的分析…

開啟WSL的鏡像網絡模式

開啟WSL的鏡像網絡模式 前提 Windows主機系統版本高于Windows 11 22H2。WLS版本>2.0。 可輸入wsl --version查看當前系統wsl版本。 修改設置 圖形界面修改 在開始菜單中搜索&#xff1a;wsl settings&#xff0c;結果如下圖所示&#xff1a; 點擊“打開”&#xff0…

Python爬蟲第20節-使用 Selenium 爬取小米商城空調商品

目錄 前言 一、 本文目標 二、環境準備 2.1 安裝依賴 2.2 配置 ChromeDriver 三、小米商城頁面結構分析 3.1 商品列表結構 3.2 分頁結構 四、Selenium 自動化爬蟲實現 4.1 腳本整體結構 4.2 代碼實現 五、關鍵技術詳解 5.1 Selenium 啟動與配置 5.2 頁面等待與異…

聚類分析的原理、常用算法及其應用

聚類分析的原理、常用算法及其應用 一、聚類分析的基本原理 &#xff08;一&#xff09;什么是聚類分析 聚類分析是一種無監督學習方法&#xff0c;其目標是將數據集中的樣本劃分為若干個簇&#xff0c;每個簇包含相似的樣本。聚類分析的核心思想是通過某種相似性度量&#…

Aware和InitializingBean接口以及@Autowired注解失效分析

Aware 接口用于注入一些與容器相關信息&#xff0c;例如&#xff1a; ? a. BeanNameAware 注入 Bean 的名字 ? b. BeanFactoryAware 注入 BeanFactory 容器 ? c. ApplicationContextAware 注入 ApplicationContext 容器 ? d. EmbeddedValueResolverAware 注入 解析器&a…

JDK 安裝與配置

JDK 全稱是 Java SE Development Kit&#xff0c;翻譯成中文就是&#xff1a;Java 標準版開發包&#xff0c;是 Sun 公司&#xff08;后被 Oracle 公司收購&#xff09;專門外 Java 開發人員提供的一套用于開發 Java 應用程序的工具包。 JDK 提供了用于編譯和運行 Java 應用程序…

防火墻來回路徑不一致導致的業務異常

案例拓撲&#xff1a; 拓撲描述&#xff1a; 服務器有2塊網卡&#xff0c;內網網卡2.2.2.1/24 網關2.2.254 提供內網用戶訪問&#xff1b; 外網網卡1.1.1.1/24&#xff0c;外網網關1.1.1.254 80端口映射到公網 這個時候服務器有2條默認路由&#xff0c;分布是0.0.0.0 0.0.0.0 1…

Java面試高頻問題(36-37)

三十六、服務網格核心能力與設計模式 服務網格架構分層模型 mermaid graph TB subgraph 數據平面 ASidecar代理 -->攔截流量 BEnvoy B -->協議轉換 CHTTP/gRPC B -->策略執行 D熔斷/限流 end subgraph 控制平面 E配置中心 -->下發策略 Fistiod F -->證書管理 …

redis數據結構-02(INCR、DECR、APPEND)

字符串操作&#xff1a;INCR、DECR、APPEND Redis 字符串不僅僅是簡單的文本&#xff0c;它們還可以表示數字。此功能使我們能夠直接對存儲在 Redis 中的字符串值執行原子的遞增和遞減操作。此外&#xff0c;Redis 還提供了一種附加到現有字符串的方法&#xff0c;從而可以輕松…

Spring MVC 中Model, ModelMap, ModelAndView 之間有什么關系和區別?

在 Spring MVC 中&#xff0c;Model, ModelMap, 和 ModelAndView 都是用來在 Controller 和 View 之間傳遞數據的&#xff0c;但它們在使用方式和功能上有所不同。 它們的核心在于&#xff1a;Spring MVC 需要知道兩件事來渲染視圖&#xff1a;① 數據 (Model) ② 視圖名稱 (V…

配置Hadoop集群-免密登錄

在 Hadoop 集群中配置免密登錄是確保各節點間高效通信的關鍵步驟。以下是基于 SSH 密鑰認證的免密登錄配置方案&#xff0c;支持主節點&#xff08;NameNode&#xff09;到所有從節點&#xff08;DataNode&#xff09;的無密碼訪問&#xff1a; 1. 環境準備 集群規劃&#xff…

C++類與對象(二):六個默認構造函數(一)

在學C語言時&#xff0c;實現棧和隊列時容易忘記初始化和銷毀&#xff0c;就會造成內存泄漏。而在C的類中我們忘記寫初始化和銷毀函數時&#xff0c;編譯器會自動生成構造函數和析構函數&#xff0c;對應的初始化和在對象生命周期結束時清理資源。那是什么是默認構造函數呢&…

嵌入式培訓之數據結構學習(一)數據結構的基礎概念、線性表

一、基礎概念 1、數據結構&#xff1a;相互之間存在一種或多種特定關系的數據元素的集合。&#xff08;特定關系有邏輯關系與線性關系&#xff09; &#xff08;1&#xff09;邏輯結構 集合&#xff0c;所有數據在同一個集合中&#xff0c;關系平等&#xff08;數組&#xff…

Android Exoplayer 實現多個音視頻文件混合播放以及音軌切換

在之前的文章ExoPlayer中常見MediaSource子類的區別和使用場景中介紹了Exoplayer中各種子MediaSource的使用場景&#xff0c;這篇我們著重詳細介紹下實現多路流混合播放的用法。常見的使用場景有&#xff1a;視頻文件電影字幕、正片視頻廣告視頻、背景視頻背景音樂等。 初始化…

推特逆向算法,推特爬蟲,數據分析,推特關鍵詞搜索

祝大家五一假期快樂&#xff01; 最近推特加了逆向&#xff0c;頻繁出現404&#xff0c;無法正常抓取數據&#xff0c;這里給出推特逆向的思路及代碼&#xff0c;供大家參考學習&#xff01; 本文將介紹如何使用 Python 模擬請求 Twitter 的 GraphQL 接口&#xff0c;結合 re…

圖形化編程平臺的破局之道:從工具同質化到生態差異化

一、同質化困局的底層邏輯剖析 在全球圖形化編程市場中&#xff0c;工具功能趨同已成為行業共識。據 Statista 2024 年數據顯示&#xff0c;主流平臺的基礎功能重合度高達 78%&#xff0c;核心模塊&#xff08;如條件判斷、循環結構&#xff09;的實現方式高度相似。這種現象的…