Spring后端参数校验——自定义校验方式(validation)

文章目录

    • 开发场景
    • 技术名词解释——Spring Validation
      • 自定义校验
    • 技术细节
    • 小结
      • 1.实体参数校验
      • 2.自定义校验
    • 完整代码

开发场景

业务场景:新增文章

基本信息

请求路径:/article

请求方式:POST

接口描述:该接口用于新增文章(发布文章)

请求参数

请求参数格式:application/json

请求参数说明:

参数名称说明类型是否必须备注
title文章标题string1~10个非空字符
content文章正文string
coverImg封面图像地址string必须是url地址
state发布状态string已发布 | 草稿
categoryId文章分类IDnumber

请求数据样例:

{"title": "陕西旅游攻略","content": "兵马俑,华清池,法门寺,华山...爱去哪去哪...","coverImg": "https://big-event-gwd.oss-cn-beijing.aliyuncs.com/9bf1cf5b-1420-4c1b-91ad-e0f4631cbed4.png","state": "草稿","categoryId": 2
}

参数校验请求参数中要求必要的信息
此时的参数

技术名词解释——Spring Validation

提示:这里可以添加技术名词解释

Spring 提供的一个参数校验框架,使用预定义的注解完成参数校验

1、引入Spring Validation 起步依赖
2、在参数前面添加@Pattern注解
3、在Controller类上添加@Validated注解

引入依赖
在这里插入图片描述

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

添加注解
在这里插入图片描述

自定义校验

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)

技术细节

1、自定义注解State
2、自定义校验数据的类StateValidation 实现ConstraintValidator接口
3、 在需要校验的地方使用自定义注解

① 自定义注解State
在这里插入图片描述
② 自定义校验数据的类StateValidation 实现ConstraintValidator接口
在这里插入图片描述
③ 在需要校验的地方使用自定义注解
在这里插入图片描述
④ 传参加@Validated

小结

提示:这里可以添加总结

1.实体参数校验

在这里插入图片描述

2.自定义校验

在这里插入图片描述

完整代码

1、注解State

import com.shisan.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;import java.lang.annotation.*;/*** @Author:shisan @Date:2024/5/8 21:07*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StateValidation.class})
public @interface State {// 提供校验的条件,这里只校验是否为已发布或草稿String message() default "state参数只能是已发布或草稿";// 指定分组Class<?>[] groups() default {};// 负载Class<? extends Payload>[] payload() default {};
}

2、自定义校验数据的类StateValidation 实现ConstraintValidator接口

import com.shisan.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;/*** @Author:shisan* @Date:2024/5/8 21:10*/
public class StateValidation implements ConstraintValidator<State, String> {/**** @param value 将来要检验的数据* @param constraintValidatorContext* @return 如果返回true,则校验通过,否则校验失败*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {// 提供校验if(value == null || value.length() == 0){return false;}if(value.equals("已发布") || value.equals("草稿") ){return true;}return false;}
}

3、实体类添加注解

import com.shisan.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;/*** @Author:shisan @Date:2024/5/6 15:32*/
@Data
public class Article {private Integer id; // 主键id// 1~10个非空字符串@NotEmpty(message = "标题不能为空")@Pattern(regexp = "^.{1,10}$", message = "标题格式不正确")private String title; // 文章标题@NotEmpty(message = "内容不能为空")private String content; // 文章内容// 必须是url地址@NotNull(message = "封面图片不能为空")@URLprivate String coverImg; // 封面图片@State private String state; // 发布状态 1 发布 0 草稿@NotNull(message = "分类不能为空")private Integer categoryId; // 文章idprivate Integer createUser; // 发布人idprivate LocalDateTime createTime; // 发布时间private LocalDateTime updateTime; // 修改时间
}

4、控制层添加@Validated

import com.shisan.pojo.Article;
import com.shisan.pojo.Result;
import com.shisan.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;/*** @Author:shisan @Date:2024/5/8 10:51*/
@RestController
@RequestMapping("/article")
@Slf4j
public class ArticleController {@Autowired private ArticleService articleService;/*** 请求路径:/article** <p>请求方式:POST** <p>接口描述:该接口用于新增文章(发布文章)*/@PostMappingpublic Result addArticle(@RequestBody  @Validated Article article) {log.info("新增文章:{}", article);return articleService.addArticle(article);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:mybatisplus分页查询失效,总是查询到所有数据

目录 问题描述&#xff1a;解决方案&#xff1a;1.配置mybatisplus拦截器PaginationInterceptor2.自行编写SQL语句查询 问题描述&#xff1a; 在前端使用Map<String, Object> params&#xff0c;把page&#xff0c;limit参数作为请求体传送到后端&#xff0c;但是分页查…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

DSP28335开发教程--CCS问题02:Tnteger conversion resulted in truncation

出现黄色警告&#xff0c; 如何解决&#xff1a; 当你看到“integer conversion resulted in truncation”这样的错误或警告时&#xff0c;它通常意味着在数据转换过程中有数据丢失。具体来说&#xff0c;就是将一个较大的数值&#xff08;可能是浮点数、长整型等&#xff09;…

PHPStudy 下载PHP提示“当前网络不稳定,下载失败”

错误信息 当前网络不稳定&#xff0c;下载失败 获取下载链接失败&#xff0c;请检查网络 假查网络 问题原因 xp.cn服务器的网络不稳定&#xff0c;不是你电脑的网络问题。 解决办法 第一步&#xff1a;下载现成的PHP文件 直接下载现成的文件&#xff0c;放到php目录。 将…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

DEV--C++小游戏(吃星星(0.2))

目录 吃星星&#xff08;0.2&#xff09; 简介 分部代码 头文件&#xff08;增&#xff09; 命名空间变量&#xff08;增&#xff09; 副函数&#xff08;新&#xff0c;增&#xff09; 清屏函数 打印地图函数&#xff08;增&#xff09; 移动函数 选择颜色&#xff…

用HAL库改写江科大的stm32入门例子_9-2 利用中断进行串口通讯

电路和 《用HAL库改写江科大的stm32入门例子_9-1》一致。 我们在whlie循环当中&#xff0c;不断查询端口&#xff0c;获取数据&#xff0c;存放到一个数组当中,同时回显给电脑上。这种方法耗费cpu,还是用中断进行串口通讯更合理。 基本操作看到一遍写得比较清晰的博客&#x…

python-oracledb 已率先支持 Oracle 23ai

python-oracledb 介绍 python-oracledb (以下简称 oracledb) 是 Python cx_Oracle 驱动程序的新名称&#xff0c;如果你仍在使用 cx_Oracle&#xff0c;建议升级到最新版本的 oracledb。 oracledb 驱动程序是一个开源模块&#xff0c;使 Python 程序能够访问 Oracle 数据库。默…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库&#xff0c;它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架&#xff0c;用于开发图形用户界面&#xff08;GUI&…

scala速通(精简版)

1.变量和常量 var name [:VariableType] value // variable val name [:ConstantType] value // constant1.声明变量时&#xff0c;类型可以省略 2.类型定义后就不能修改言 3.变量声明必须有初始值 4.变量&#xff0c;常量分别用var&#xff0c;val声明修饰 2.标识符命名…

识货小程序逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872&#xff0c;x30184483x…

仓库管理系统需求调研要点

仓库管理系统需求调研 一、仓库的作用 仓库分类 原材料仓库&#xff1a;用于存放生产所需的原材料和零部件&#xff0c;需要保持原材料的质量和数量稳定。半成品仓库&#xff1a;存放生产过程中的半成品和在制品&#xff0c;需要保持良好的生产流程和及时出库。成品仓库&#x…

05-08 周三 FastBuild FastAPI 引入并发支持和全局捕获异常

时间版本修改人描述2024年5月8日20:41:03V0.1宋全恒新建文档 简介 由于FastBuild之前花费了大概5天的时间优化&#xff0c;但最近重新部署&#xff0c;又发现了一些问题&#xff0c;就很痛苦&#xff0c;五一之后&#xff0c;自己又花了三天的时间系统的进行了优化。 上一波优…

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战&#xff0c;例如右侧截尾&#xff08;右侧截尾表示未观察到的事件发生&#xff0c;例如研究结束时还未发生事件&#…

2024年第七届人工智能和模式识别国际会议(AIPR 2024)即将召开!

2024年第七届人工智能和模式识别国际会议&#xff08;AIPR 2024)将于2024年9月20-22日在福建厦门市的华侨大学举行。探索AI边界&#xff0c;解锁识别新境界&#xff01;AIPR 2024旨在促进模式识别与机器学习, 计算机视觉与机器人视觉, 图像、语音、信号和视频处理等领域尖端成果…

星辰考古:TiDB v1.0 再回首

“ 1.0 版本只是个开始&#xff0c;是新的起点&#xff0c;愿我们一路相扶&#xff0c;不负远途。 前言 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。 近日&#xff0c;TiDB v8.0.0 DMR 发布&#xff0c;详细发版说明戳这里&#xff1a; https://docs.pingca…

Java | Spring框架 | @Autowired与@Resource

在Spring框架中&#xff0c;依赖注入是一种核心概念&#xff0c;它允许开发者将对象的创建和对象之间的依赖关系的管理交给框架来处理。这样做的目的是为了提高代码的模块化和可测试性。 Spring提供了多种方式来实现依赖注入&#xff0c;其中最常用的方式是通过注解。在本文中…

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

linux部署java1.8(jdk1.8)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

Python 全栈体系【四阶】(四十一)

第五章 深度学习 九、图像分割 1. 基本介绍 1.1 什么是图像分割 图像分割&#xff08;Segmentation&#xff09;是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&a…