Java參數校驗詳解:使用@Valid注解和自定義注解進行參數驗證

? 很多時候我們需要使用不少if、else等等邏輯判斷及驗證,這樣在進行一些重復的參數校驗會很麻煩,且以后要維護也會吃力。

? 而這樣就可以使用javax.validation驗證(Validation)常見的驗證操作包括驗證數據的類型、格式、長度、范圍、唯一性等

javax.validation 包:Java SE 6+ 中引入了 javax.validation 包,作為 Bean Validation 規范的一部分。這個包提供了一組注解和接口,可以方便地進行數據驗證。

<!-- ? ? ?  validation組件依賴-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

? 而對于一般寫在業務邏輯類中的參數校驗語句,可以省略。如將@Valid注解填寫在登錄接口的方法參數中:

@PostMapping("/login")
public RespBean login(@Valid @RequestBody User user) {log.info("{}", user);return userService.login(user);
}
  • @Valid 注解對入參進行相應的校驗:

注解使用在方法參數上,然后對于參數的校驗要求可去參數的實體類進行校驗條件的填寫。

/*** @author Z* @date 2023/9/27 21:25*/
@Data
public class User {@NotNull //賬號非空//這個@Mobile是自定義判斷注解,下面有對其的創建進行詳細的講解@Mobile(required = true) private String mobile;
?@NotNull //密碼非空@Length(min = 32) ?//長度的限制private String password;
}

以及如: @Size(min=1, max=12) 代表:長度在 1 ~ 12 字符之間。其他一些判斷的注解可以去該導入的外部庫查看。

也可以自定判斷條件注解:如@Mobile這個自定義的注解:

1.創建軟件包:Validation

2.創建需要的注解:Mobile

3.而對于這個注解的寫法,直接去拷貝javax.validation 包中已經寫好的注解,如:@Notnull注解進行修改:(有報錯的地方就刪除不用即可)

@Notnull注解如下:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotNull.List.class) ?//爆紅了刪除
@Documented
@Constraint(validatedBy = {}) //校驗規則的定義
public @interface NotNull {String message() default "{javax.validation.constraints.NotNull.message}";//修改校驗的消息
?Class<?>[] groups() default {};
?Class<? extends Payload>[] payload() default {};
?
}

而在這里在添加一條屬性:(代表必填)

 boolean required() default true;

  • 自定義的@Mobile如下:

/*** @author Z* @date 2023/9/28 8:53*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自己定義校驗規則的一個類:MobileValidator.class (手機號碼校驗規則類)
//將自定義規則類放進@Constraint(validatedBy={}) 中
@Constraint(validatedBy = {MobileValidator.class})
public @interface Mobile {
?boolean required() default true;
?//信息,拋出的是BindException,前端頁面接收的話,我們要進行異常的捕獲String message() default "手機號碼格式錯誤";
?Class<?>[] groups() default {};
?Class<? extends Payload>[] payload() default {};
}

而我們需要進行自己定義檢驗規則,創建一個校驗規則類,并將其放進@Constraint(validatedBy={}) 中

  • 自定義校驗規則類:

/*** 手機號碼校驗規則** @author Z* @date 2023/9/28 8:56*/
public class MobileValidator implements ConstraintValidator<Mobile, String> {
?private boolean required = false;
?//初始化:獲取是否需要是必填的@Overridepublic void initialize(Mobile constraintAnnotation) {//獲取到填的值:true或者falserequired = constraintAnnotation.required();}
?@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//必填:則使用手機號碼校驗工具類去校驗if (required){return ValidatorUtil.Mobile(value);//非必填:}else {if (StringUtils.isEmpty(value)){ //傳的號碼為空return true;}else {//傳的號碼非空,則使用手機號碼校驗工具類去校驗return ValidatorUtil.isMobile(value);}}}
}
  • 而對于手機號碼的校驗工具類:

添加依賴:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

使用正則表達進行手機號碼的校驗:

import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
?
/*** 手機號碼校驗類 (使用正則表達式)** @author Z* @date 2023/9/27 21:45*/
public class ValidatorUtil {
?private static final Pattern mobile_pattern = Pattern.compile("[1]([3-9])[0-9]{9}$");
?public static boolean Mobile(String mobile) {if (StringUtils.isEmpty(mobile)){return false;}Matcher matcher = mobile_pattern.matcher(mobile);return matcher.matches();}
}

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

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

相關文章

我想漲工資,請問測試開發該怎么入門?

我是測試開發工程師!歡迎和我交流測試領域相關問題&#xff08;測試入門、技術、python交流都可以&#xff09; 我幾乎是靠這套方法&#xff0c;從一個只會功能測試的小白&#xff0c;到成為測試開發工程師的。 別急&#xff0c;先慢慢看&#xff0c;只要按照下面的流程走一遍…

postcss-pxtorem實現頁面自適應的原理

先聲明一點這玩意本身不能實現哈&#xff0c;他只是一個工具&#xff0c;更是一個postcss的插件 幫助我們從px轉化成為rem比如我們的代碼 div {height: 100px;width: 100px; }經過這個插件轉化之后變成 假設變成下面這樣哈 div {height: 1rem;width: 1rem; }其他沒啥子太大作…

P1046 [NOIP2005 普及組] 陶陶摘蘋果題解

題目 陶陶家的院子里有一棵蘋果樹&#xff0c;每到秋天樹上就會結出 1010 個蘋果。蘋果成熟的時候&#xff0c;陶陶就會跑去摘蘋果。陶陶有個 3030 厘米高的板凳&#xff0c;當她不能直接用手摘到蘋果的時候&#xff0c;就會踩到板凳上再試試。 現在已知 1010 個蘋果到地面的…

Spring全面詳解

目錄 1. Spring 概述 1.1 Spring是什么 1.2 Spring的作用 1.3 Spring IoC是什么 2. Spring 快速入門 3. Spring Bean 3.1 的實例化方式 空參構造器 3.2 的屬性注入 全參構造器注入 setter方法注入 策略模式 3.3 注解管理 3.4 注解方式的屬性注入 1. Spring 概述 …

奕碳科技亮相COP28:展現中國智慧,引領全球碳減排新篇章

11月30日,聯合國氣候變化框架公約第28次締約方大會 (COP28) 在阿聯酋迪拜開幕。COP28是全球氣候治理的重要盛會&#xff0c;匯聚了世界各國領導人、企業界和科學界代表&#xff0c;共同探討和制定應對全球氣候變化的策略與行動計劃。在這樣的背景下&#xff0c;企業群體的積極參…

跨境電商系統搭建 無貨源系統對接API 反向代購系統

跨境電商系統是為國外的客戶代購中國商品的系統&#xff0c;系統實現與國內電商API對接&#xff0c;客戶可直接在系統中搜索國內電商平臺的商品。查看演示網站 一級功能二級功能 標準版 高級版 企業版 企業旗艦版 大客戶尊享版 標準版高級版企業版企業旗艦版大客戶尊享版 前臺主…

shell常用組合命令整理

shell常用組合命令整理 rm -f 是一個用于在Unix/Linux系統中刪除文件的命令。這個命令具有以下特點&#xff1a; -f 選項表示“強制”&#xff08;force&#xff09;&#xff0c;即強制刪除文件而不提示用戶確認。使用 -f 選項時&#xff0c;rm 命令不會詢問用戶是否確定刪除&…

2023.12.7 關于 MySQL 事務詳解

目錄 事務的四大特性 原子性 一致性 持久性 隔離性 事務并發執行 臟讀 不可重復讀 幻讀 四個隔離級別 read uncommitted read committed repeatable read serializable 事務的四大特性 原子性 一個事務中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部…

Java數據結構之《鏈式二叉樹的創建及遍歷》(難度系數100)

一、前言&#xff1a; 這是懷化學院的&#xff1a;Java數據結構中的一道難度偏難(偏難理解)的一道編程題(此方法為博主自己研究&#xff0c;問題基本解決&#xff0c;若有bug歡迎下方評論提出意見&#xff0c;我會第一時間改進代碼&#xff0c;謝謝&#xff01;) 后面其他編程題…

視頻剪輯:視頻轉碼實用技巧,批量將MP4轉為MP3音頻

隨著數字媒體設備的普及&#xff0c;視頻和音頻文件已成為日常生活中的重要組成部分。有時&#xff0c;可能要將MP4視頻文件轉換為MP3音頻文件&#xff0c;以提取其中的音頻內容或者進行其他處理。這是耗費時間的任務&#xff0c;那要如何操作呢&#xff1f;本文詳解云炫AI智剪…

TypeScript中泛型對象、泛型類

一. 概覽 本文詳細介紹泛型中泛型對象和泛型類的使用&#xff0c;結合實際應用場景&#xff0c;加深對泛型的理解、使用。 二. 泛型對象 舉個例子 const test {a: 1,b: 1 }一個類型有沒有一種可能讓我么在定義的時候傳入一個類似于變量的形參&#xff0c;在使用的時候傳入…

Jtti:香港云服務器如何實現遠程連接?

云服務器具有靈活擴展、高可用性、易于管理和數據安全等優點&#xff0c;因此被廣泛應用于各種業務場景。然而&#xff0c;對于初次使用云服務器的用戶來說&#xff0c;如何實現遠程連接可能是一個難題。本文將詳細介紹云服務器實現遠程連接的步驟和注意事項&#xff0c;幫助用…

教你pycharm運行Django第一個項目

文章目錄 前言搭建Django:1.新建Django項目&#xff1a;2.為Django項目指定遠程中創建的虛擬環境下的python解釋器&#xff1a;3.配置ubuntu的端口轉發&#xff08;添加端口號為1234的端口&#xff09;&#xff1a;關于Python技術儲備一、Python所有方向的學習路線二、Python基…

循環單向鏈表與約瑟夫問題

循環鏈表介紹 先不急著看約瑟夫問題是什么&#xff0c;先了解循環鏈表的結構&#xff0c;那什么是循環鏈表&#xff1f; 循環&#xff0c;顧名思義&#xff0c;從鏈表中第一個節點出發&#xff0c;還會遇到第一個節點&#xff0c;形成循環的一環。也就是說鏈表中最后一個節點…

python 使用 watchdog 實現類似 Linux 中 tail -f 的功能

一、代碼實現 import logging import os import threading import timefrom watchdog.events import FileSystemEventHandler from watchdog.observers import Observerlogger logging.getLogger(__name__)class LogWatcher(FileSystemEventHandler):def __init__(self, log_…

《opencv實用探索·十五》inRange二值化圖像

opencv接口如下&#xff1a; void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函數實現二值化功能&#xff0c;主要是將在兩個閾值內的像素值設置為白色&#xff08;255&#xff09;&#xff0c;而不在閾值區間內的像素值設置為黑色&am…

一篇文章帶你快速入門 Nuxt.js 服務端渲染

1. Nuxt.js 概述 1.1 我們一起做過的SPA SPA&#xff08;single page web application&#xff09;單頁 Web 應用&#xff0c;Web 不再是一張張頁面&#xff0c;而是一個整體的應用&#xff0c;一個由路由系統、數據系統、頁面&#xff08;組件&#xff09;系統等等&#xff0…

什么是HTTPS加密協議?HTTPS安全傳輸原理,SSL和TLS介紹,NGINX如何配置SSL證書

HTTPS介紹 HTTPS是超文本傳輸協議&#xff08;HTTP&#xff09;的安全版本。它使用SSL&#xff08;安全套接層&#xff09;或TLS&#xff08;傳輸層安全&#xff09;加密協議來保護數據傳輸的安全性和機密性&#xff0c;以防止未經授權的訪問和竊聽。HTTPS協議通常用于處理敏感…

HbuilderX使用Uniapp+Vue3安裝uview-plus

如果你是vue2版本想使用uniapp去配置uviewui庫可以參考之前的文章 小程序的第三方ui庫推薦較多的還是uview的&#xff0c;看起來比較美觀&#xff0c;功能也比較完善&#xff0c;下面將提一下Vue3安裝uview-plus庫的教程 創建項目 安裝 首先進入官網 uView-Plus 直接下載并導…

預訓練--微調

預訓練–微調 一個很簡單的道理&#xff0c;如果我們的模型是再ImageNet下訓練的&#xff0c;那么這個模型一定是會比較復雜的&#xff0c;意思就是這個模型可以識別到很多種類別的即泛化能力很強&#xff0c;但是如果要它精確的識別是否某種類別&#xff0c;它的表現可能就不…