【系統參數合法性校驗】spring-boot-starter-validation

JSR303校驗

統一校驗的需求

前端請求后端接口傳輸參數,是在controller中校驗還是在Service中校驗?
答案是都需要校驗,只是分工不同。
Contoller中校驗請求參數的合法性,包括:必填項校驗,數據格式校驗,比如:是否是符合一定的日期格式,等。
Service中要校驗的是業務規則相關的內容,比如:課程已經審核通過所以提交失敗。
Service中根據業務規則去校驗不方便寫成通用代碼,Controller中則可以將校驗的代碼寫成通用代碼。
早在JavaEE6規范中就定義了參數校驗的規范,它就是JSR-303,它定義了BeanValidation,即對bean屬性進行校
驗。
SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底層使用HibernateValidator,
HibernateValidator是BeanValidation的參考實現。
所以,我們準備在Controller層使用spring-boot-starter-validation完成對請求參數的基本合法性進行校驗。

if校驗

@Transactional
@Override
public CourseBaseInfoDto createCourseBase(Long companyId, AddCourseDto addCourseDto) {// 參數合法性校驗if (StringUtils.isBlank(addCourseDto.getName())) {//            throw new RuntimeException("課程名稱為空");XueChengPlusException.cast("課程名稱為空");}if (StringUtils.isBlank(addCourseDto.getMt())) {throw new RuntimeException("課程分類為空");}if (StringUtils.isBlank(addCourseDto.getSt())) {throw new RuntimeException("課程分類為空");}if (StringUtils.isBlank(addCourseDto.getGrade())) {throw new RuntimeException("課程等級為空");}if (StringUtils.isBlank(addCourseDto.getTeachmode())) {throw new RuntimeException("教育模式為空");}if (StringUtils.isBlank(addCourseDto.getUsers())) {throw new RuntimeException("適應人群為空");}if (StringUtils.isBlank(addCourseDto.getCharge())) {throw new RuntimeException("收費規則為空");}// 向課程基本信息表course_base插入數據CourseBase courseBase = new CourseBase();BeanUtils.copyProperties(addCourseDto, courseBase);courseBase.setCompanyId(companyId);courseBase.setCreateDate(LocalDateTime.now());// 審核狀態默認為未提交courseBase.setAuditStatus("202002");// 發布狀態為未發布courseBase.setStatus("203001");int insert = courseBaseMapper.insert(courseBase);if (insert <= 0) {throw new RuntimeException("添加課程失敗");}// 向課程營銷系course_market寫入數據CourseMarket courseMarket = new CourseMarket();BeanUtils.copyProperties(addCourseDto, courseMarket);// 主鍵的課程idcourseMarket.setId(courseBase.getId());saveCourseMarket(courseMarket);// 從數據庫查詢課程的詳細信息,包括兩部分return getCourseBaseInfo(courseBase.getId());
}

@Validated注解校驗

依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

定義校驗

package com.xuecheng.content.model.dto;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.math.BigDecimal;/*** @author Mr.M* @version 1.0* @description 添加課程dto* @date 2022/9/7 17:40*/
@Data
@ApiModel(value = "AddCourseDto", description = "新增課程基本信息")
public class AddCourseDto {@NotEmpty(message = "課程名稱不能為空")@ApiModelProperty(value = "課程名稱", required = true)private String name;@NotEmpty(message = "適用人群不能為空")@Size(message = "適用人群內容過少", min = 10)@ApiModelProperty(value = "適用人群", required = true)private String users;@ApiModelProperty(value = "課程標簽")private String tags;@NotEmpty(message = "課程分類不能為空")@ApiModelProperty(value = "大分類", required = true)private String mt;@NotEmpty(message = "課程分類不能為空")@ApiModelProperty(value = "小分類", required = true)private String st;@NotEmpty(message = "課程等級不能為空")@ApiModelProperty(value = "課程等級", required = true)private String grade;@ApiModelProperty(value = "教學模式(普通,錄播,直播等)", required = true)private String teachmode;@ApiModelProperty(value = "課程介紹")@Size(message = "課程描述內容過少", min = 10)private String description;@ApiModelProperty(value = "課程圖片", required = true)private String pic;@NotEmpty(message = "收費規則不能為空")@ApiModelProperty(value = "收費規則,對應數據字典", required = true)private String charge;@ApiModelProperty(value = "價格")private Float price;@ApiModelProperty(value = "原價")private Float originalPrice;@ApiModelProperty(value = "qq")private String qq;@ApiModelProperty(value = "微信")private String wechat;@ApiModelProperty(value = "電話")private String phone;@ApiModelProperty(value = "有效期")private Integer validDays;
}

@Validated 激活校驗

@ApiOperation("新增課程")
@PostMapping("course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated AddCourseDto addCourseDto) {// 獲取到用戶所屬機構idLong companyId = 1232141425L;int i = 1/0;return courseBaseInfoService.createCourseBase(companyId, addCourseDto);
}

分組校驗

當多個接口使用同一個模型類的時候,當多個接口對校驗的需求不一樣,這個時候采用分組校驗

用于分級校驗,定義一些常用的組

package com.xuecheng.base.execption;/*** @program: xuecheng-plus-project* @since: jdk1.8* @description: 用于分級校驗,定義一些常用的組* @author: Administrator* @create: 2025-04-29 21:55**/
public class ValidationGroups {public interface Insert {}public interface Update {}public interface Delete {}
}

dto

image-20250429220019012

CourseBaseInfoController

image-20250429220306339

校驗規則不滿足?

如果javax.validation.constraints包下的校驗規則滿足不了需求怎么辦?
1、手寫校驗代碼。
2、自定義校驗規則注解。
如何自定義校驗規則注解,請自行查閱資料實現。

面試

請求參數的合法性校驗如何做?

使用基于JSR303的校驗框架實現,SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-valiqation,它
包括了很多校驗規則,只需要在模型類中通過注解指定校驗規則,在controller方法上開啟校驗。

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

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

相關文章

[零基礎]內網ubuntu映射到云服務器上,http訪問(frp內網穿透)

阿里云服務器&#xff0c;高校教師可以半價&#xff0c; frp下載地址&#xff1a;https://github.com/fatedier/frp/releases&#xff0c;選amd64&#xff0c; 云服務器開放端口 選擇網絡與安全–>安全組->管理規則 配置開放端口&#xff0c;7000為支持frp開放的端口&…

第十六屆藍橋杯 2025 C/C++組 破解信息

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P12344 [藍橋杯 2025 省 B/Python B 第二場] 破解信息…

OpenAI Embedding 和密集檢索(如 BERT/DPR)進行語義相似度搜索有什么區別和聯系

OpenAI Embedding 和密集檢索&#xff08;如 BERT/DPR&#xff09;其實是“同一種思想的不同實現”&#xff0c;它們都屬于Dense Retrieval&#xff08;密集向量檢索&#xff09;&#xff0c;只不過使用的模型、部署方式和調用方式不同。 &#x1f9e0; 首先搞清楚&#xff1a;…

Linux電源管理(3)_關機和重啟的過程

原文&#xff1a;Linux電源管理&#xff08;3&#xff09;_Generic PM之重新啟動過程 1.前言 在使用計算機的過程中&#xff0c;關機和重啟是最先學會的兩個操作。同樣&#xff0c;這兩個操作在Linux中也存在&#xff0c;可以關機和重啟。這就是這里要描述的對象。在Linux Ke…

C# 繼承詳解

繼承是面向對象程序設計&#xff08;OOP&#xff09;中的核心概念之一&#xff0c;它極大地增強了代碼的重用性、擴展性和維護性。本篇文章將詳細講解C#中的繼承機制&#xff0c;包括基礎概念、語法特法、多重繼承&#xff08;通過接口實現&#xff09;、繼承的規則和實際應用示…

SQLAlchemy 2.x 異步查詢方法比較

SQLAlchemy 2.x 異步查詢中常用的 結果處理方法速查表&#xff0c;包含方法說明、使用場景、返回類型及典型用途。 SQLAlchemy 查詢結果處理方法速查表&#xff08;適用于 AsyncSession&#xff09; 方法 說明 返回類型 示例 SQL 示例輸出 scalars().all() 獲取單列所有…

極客天成參與”AI助力智慧城市構建”主題演講暨招商引智專題推介活動

4月7日下午&#xff0c;北京極客天成科技有限公司參加了天津市河東區數據局舉辦的“AI賦能智慧城市構建”主題演講暨招商引智專題推介活動。 活動中&#xff0c;華為&#xff08;天津&#xff09;有限公司數字政府解決方案總監姜華庚圍繞“政務大模型賦能智慧城市建設”&#x…

理解 EKS CloudWatch Pod CPU Utilization 指標:與 `kubectl top` 及節點 CPU 的關系

在使用 AWS EKS 時&#xff0c;CloudWatch Container Insights 提供了豐富的容器級別監控指標&#xff0c;幫助我們深入了解應用的運行狀態。如下截圖中的 ContainerInsights pod_cpu_utilization 指標就是一個非常重要的維度。本文將詳細解釋這個指標的含義&#xff0c;并將其…

使用pip3安裝軟件包報錯`externally-managed-environment`的幾種解決方式

1、pip3安裝軟件包報錯 報錯externally-managed-environment的原因&#xff1a; 從 Python 3.11 開始引入了 PEP 668 規范&#xff0c;該規范限制了在系統級 Python 環境中使用 pip 安裝第三方包&#xff0c;以避免與系統包管理器&#xff08;如 apt&#xff09;產生沖突。 如…

spring security用戶退出

Spring security默認實現了用戶退出的功能&#xff0c;用戶退出主要考慮退出后會話如何管理以及跳轉到哪個頁面。HttpSecurity類提供了logout()方法開啟退出登錄的支持&#xff0c;默認觸發用戶退出操作的URL為“/logout”&#xff0c;用戶退出時同時也會清除Session等默認用戶…

愛普生SG2520HHN晶振數據中心服務器的理想解決方案

在當今數字化時代&#xff0c;數據中心作為海量數據存儲、處理與傳輸的核心樞紐&#xff0c;其服務器的高效穩定運行至關重要。服務器作為其核心設備&#xff0c;對時鐘信號的精度和穩定性提出了嚴苛要求——微小的時序誤差可能導致數據傳輸失敗或系統宕機。愛普生 SG2520HHN 差…

LeetCode 155題解 | 最小棧

最小棧 一、題目鏈接二、題目三、算法原理思路1&#xff1a;用一個變量存儲最小元素思路2&#xff1a;雙棧普通棧和最小棧 四、編寫代碼五、時間復雜度 一、題目鏈接 最小棧 二、題目 三、算法原理 棧用數組、鏈表實現都行&#xff0c;最主要的就是在能在常數時間內檢索到最…

es+kibana---集群部署

其實一般es要跑3個節點的&#xff0c;這樣才能做高可用&#xff0c;處理并發大&#xff0c;但是我這里只是一個pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取鏡像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【導入鏡像】 docker load -i es.…

WPF常用技巧匯總 - Part 2

WPF常用技巧匯總-CSDN博客 主要用于記錄工作中發現的一些問題和常見的解決方法。 目錄 WPF常用技巧匯總-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一樣 3. DataGrid Tooltip - Cell值和ToolTip值不一樣 4. DataGrid - Ctrl A /…

uniapp打包apk如何實現版本更新

我們做的比較簡單&#xff0c;在后端設置版本號&#xff0c;并在uniapp的config.js中定義版本號&#xff0c;每次跟后端的進行對比&#xff0c;不一致的話就更新。 一、下載apk 主要代碼&#xff08;下載安裝包&#xff0c;并進行安裝&#xff0c;一般得手動同意安裝&#xf…

局部和整體的關系

Prompt&#xff1a;為什么要研究局部和整體的關系呢&#xff1f;是因為很多情況下&#xff0c;局部就能表達出整體&#xff1f; 這是一個非常本質的問題&#xff0c;其實你已經接近數學和物理中“幾何本質”的核心了。我們研究局部和整體的關系&#xff0c;是因為&#xff1a;…

企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告

全球組織數字化與智能化背景下 企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告 一、背景與市場需求 市場規模與增量 根據Statista數據&#xff0c;全球協同辦公平臺市場規模預計從2023年的$480億增長至2027年的$900億&#xff0c;年復合增長率&#xff08;CAG…

【2025最新面試八股常問知識點】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的進化之路。

HTTP 超文本傳輸協議&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;縮寫&#xff1a;HTTP&#xff09;是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的…

【算法練習】歸并排序和歸并分治

文章目錄 1.歸并排序1.1 遞歸版本1.2 非遞歸版本 2.歸并分治2.1 計算數組的小和2.2 計算翻轉對 1.歸并排序 歸并排序的核心步驟是&#xff1a; 拆分&#xff1a;將無序數組不斷對半拆分成小塊&#xff0c;直到每個小塊只剩一個元素&#xff08;自然有序&#xff09;。 合并&a…

域對齊是什么

域對齊&#xff08;Domain Alignment&#xff09;是在機器學習和計算機視覺等領域中常用的技術 定義 域對齊旨在將不同域&#xff08;Domain&#xff09;的數據映射到一個共同的特征空間中&#xff0c;使得來自不同域的數據在該空間中具有相似的分布。這里的“域”可以指代不…