Validated的分组校验和自定义校验注解

1. Validated的分组校验     

1.1 简介

        Validated的分组校验是指根据不同的校验规则对同一个实体类进行不同的校验。这在实际开发中非常常见,比如在新增和更新操作中,可能有不同的校验规则。

1.2 使用方法

        在实体类中,我们可以利用javax.validation.constraints包下的注解来定义不同的校验规则,并使用分组校验的方式来指定在不同的场景下使用哪些校验规则。

举例子:我的代码添加的时候,是使用mysql的主键自动生成策略不需要传入主键,但修改的时候需要,他们又需要相同的javabean对象,如果没有分组校验,难道我需要再创一个javabean还是传入的是否手动使用if判断,显然和下述对比,这两种都很麻烦。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {@NotNull(groups = Update.class)//因为新增不需要,修改需要,可以设置分组校验private Integer id;//文章分类id@NotEmptyprivate String categoryName;//文章分类名称@NotEmptyprivate String categoryAlias;//文章分类别名private Integer createUser;//创建人id@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//添加日期格式private LocalDateTime createTime;//创建时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;//修改时间//设置分组校验public interface Add extends Default{}public interface Update extends Default {}
}

        在上面的例子中,我们定义了一个Category实体类,并使用@NotNull@NotBlank等注解来定义校验规则,并通过groups属性来指定在不同的分组下生效。 

1.3 在Controller中使用分组校验

在Controller中,我们可以利用@Validated注解来指定需要校验的分组,并通过BindingResult来获取校验结果。

/*** 更新文章分类* @param category 解析前端提交的json封装的javabean* @return 是否修改成功*/
@PutMapping
public Result updateCategory(@RequestBody @Validated(Category.Update.class) Category category){categoryService.updateCategory(category);return Result.success();
}
/*** 新增文章分类* @param category 文章分类的javabean,自动解析前端提交的json数据并进行封装* @return 是否添加成功*/
@PostMapping
public Result addCategory(@RequestBody @Validated(Category.Add.class) Category category){categoryService.addCategory(category);return Result.success();
}

2. 自定义校验注解 

2.1 简介

        除了使用内置的校验注解外,我们还可以自定义校验注解来满足特定的校验需求。自定义校验注解通常需要定义一个注解接口,并编写对应的校验器。

2.2 使用方法

首先,我们定义一个自定义的校验注解@State:作用是标记该属性为枚举类型,只能含有两种状态,其他的状态报错。

/*** @Description: Validated自定义参数校验的注解* @Author: windStop* @Date: 2024/5/28 15:29*/
@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 {};
}

然后编写对应的校验器 StateValidation 并实现 ConstraintValidator<State,String>约束校验器接口

泛型一:给哪个注解提供校验规则
泛型二:校验的数据类型

/*** @Description: 提供自定义校验规则的类* @Author: windStop* @Date: 2024/5/28 15:33* ConstraintValidator<State,String>   参数一: 给哪个注解提供校验规则  参数二:校验的数据类型*/
public class StateValidation implements ConstraintValidator<State,String> {/*** 判断被@State标记的字段是否符合要求* @param s 待校验的值* @param constraintValidatorContext 在校验过程中进行一些上下文相关的操作* @return 是否符合要求*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {//提供校验规则if (s == null) return false;return s.equals("已发布") || s.equals("草稿");}
}
最后,在实体类中使用自定义的校验注解直接在属性中使用@State即可

通过以上的步骤,我们可以轻松地在Spring Boot项目中使用Validated的分组校验和自定义校验注解,实现灵活且强大的数据校验功能。

希望本文对你有所帮助,祝你在项目中顺利应用数据校验功能!

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

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

相关文章

幂等性解决方案

1、幂等性 在计算机中&#xff0c;表示对【同一个过程】应用【相同的参数】多次和应用一次产生的效果是一样&#xff0c;这样的过程即被称为满足幂等性。 幂等&#xff1a; update user set age 25 where user_id2这中情况无论执行多少次&#xff0c;结果都不受影响&#x…

Java | Leetcode Java题解之第103题二叉树的锯齿形层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> ans new LinkedList<List<Integer>>();if (root null) {return ans;}Queue<TreeNode> n…

Go 使用bcrypt实现密码加密和和校验

在Go语言中&#xff0c;使用bcrypt算法进行密码的加密和校验是一种常见的做法&#xff0c;因为bcrypt算法可以提供强大的密码安全性。 bcrypt可以用于数据库中的用户密码保存&#xff0c;相比md5而言更加的安全可靠 文档 https://pkg.go.dev/golang.org/x/crypto/bcrypt 文档…

SYD881X HID工程重连后连接参数没有更新功耗下不来

SYD881X HID工程重连后连接参数没有更新功耗下不来 现在测试到一个问题,第一次连接上的时候过一段时间功耗会下来到100UA以内,这个是正常的,但是关掉手机蓝牙再打开手机蓝牙就发现功耗是500UA左右下不来了! 抓包发现第一次连接和重连的时候手机给的连接参数是一样的: 问题是当…

电力电子技术03 (1)---电路稳态分析方法

学习来源&#xff08;只用于个人学习笔记&#xff0c;建议对着老师视频学习理解更深入&#xff09;&#xff1a;2.2稳态分析的基本方法_哔哩哔哩_bilibili 一、Buck降压电路 Buck电路&#xff0c;也称为降压转换器&#xff0c;是一种DC-DC电压转换器&#xff0c;用于将输入电…

PHP精度处理

一、问题缘由 PHP 服务接收前端传过来的单价(字符串形式)和数量&#xff0c;把单价转成分(单价*100)&#xff0c;然后传给下游的 Golang 服务&#xff0c;不过最后从两个服务日志中发现金额相差 1。 以下为前端传的 {"amount": 4,"price": "9.2&qu…

代码随想录算法训练营第四十六天||139.单词拆分

一、139.单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a; 输入: s …

python下将sqlite数据提取出来,转化为json数据

问题描述&#xff1a;我需要将sqlite数据提取出来做一部分处理&#xff0c;使用pandas&#xff0c;sqlite3库实现 大致的思路&#xff1a;使用sqlite3读取指定路径的数据&#xff0c;然后使用pandas.read_sql_query接收数据&#xff0c;然后to_dict&#xff0c;再写入到json文件…

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…

Vscode行尾序列LF和CRLF

提交代码时要注意&#xff1a; LF: line feed 代表换行 \n CRLF: carriage return line feed 代表回车并换行 \r\n (window系统下的换行) LF (Line Feed): 缩写&#xff1a;LF 字符&#xff1a;\n 描述&#xff1a;在Unix和Unix-like系统&#xff08;如Linux和macOS&#xf…

关于DOS

磁盘操作系统&#xff0c;Disk Operating System&#xff0c;属于单用户单任务操作系统&#xff0c;一次只能执行一个任务。一次只能执行一个任务。DOS操作系统是通过输入命令来执行一些操作。DOS已退出市场&#xff0c;WinNT/2K/XP中有个叫“命令提示符”&#xff08;CMD&…

2024-5-28 石群电路-16

2024-5-28&#xff0c;星期二&#xff0c;20:14&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么特别的事情发生&#xff0c;不过返校假期已经开始啦&#xff0c;和女朋友逛了街&#xff0c;吃了好吃的&#xff0c;学习也当然不能落下啦&#xff0…

Qt 自定义代理类

一.使用步骤 继承QStyledItemDelegate类&#xff1a;首先创建一个新的类并继承自QStyledItemDelegate类&#xff0c;作为您的自定义代理类。 实现代理类的构造函数&#xff1a;在代理类中实现构造函数&#xff0c;并在构造函数中调用基类的构造函数&#xff0c;可以选择传入一…

BIO/NIO学习

在传送文件的时候常常出现这么一个问题&#xff0c;就是当客户端的文件全部传送完了之后&#xff0c;服务器没有接收到客户端那边传过的停止信号&#xff0c;所以服务器也就跟着客户端停止运行了&#xff0c;我们可以使用 try {socket.shutdownOutput();} catch (IOException e…

web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vite

MENU 静态资源与打包规则动态访问静态资源直接导入将静态资存放在public目录中动态导入URL构造函数结束语实践与坑附文 静态资源与打包规则 介绍 Vite脚手架在打包代码的时候&#xff0c;会把源代码里对于静态资源的访问路径转换为打包后静态资源文件的路径。主要的区别是文件指…

ROS 话题通信(C++)

ROS 话题通信&#xff08;C&#xff09; 话题并不只属于发布者或订阅者,而是由ROS系统创建管理的,只要节点向NodeHandle大管家提出的话题发布需求或者话题订阅需求,这个话题就会自动被创建 这段话的核心是解释ROS&#xff08;Robot Operating System&#xff09;中话题&#xf…

go-gin中session实现redis前缀和db库选择+单点登录

分别实现了redigo中自动加前缀和session中自动加前缀 等有空了整理一个demo放到github上&#xff0c;到时候求个小星星 在gin-contrib/sessions/redis库中redis的前缀是被封装起来了&#xff0c;所以自定义前缀没有内部方法在这里我们自己实现一下NewStoreWithDBPrefix方法配…

记录一次开源 MaxKey 安装部署

官方文档&#xff1a;https://www.maxkey.top/doc/docs/intro/ 开源代码&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey 发行版&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey/releases 一、准备工作 yum install -y yum-utils yum-config-manager --add-r…

SwiftUI初探

SwiftUI 虽然出现了好几年(1.0好像2019年出的&#xff0c;还有SPM也是同一年)&#xff0c;现在已经到从1.0到5.0&#xff0c;但受限于对系统的要求(最低iOS13.0,有的要求17.0及以上)&#xff0c;每个版本里面差异也很大&#xff0c;语法和Flutter 的Dart 比较像。空闲之余可以先…

谈谈什么是生成器,它与列表推导式有何区别?以及如何使用Python进行异常处理?

生成器&#xff08;Generator&#xff09;是一种特殊的函数&#xff0c;它一次生成一个值&#xff0c;而不是一次性生成所有值。可以将其视为可恢复函数&#xff0c;在函数执行过程中&#xff0c;yield语句会返回需要的值给调用生成器的地方&#xff0c;然后退出函数。下一次调…