【系统参数合法性校验】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.mzph.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;使得来自不同域的数据在该空间中具有相似的分布。这里的“域”可以指代不…