spring-validation实现分组校验

文章目录

    • 前言
    • 实际开发可能会使用到分组校验
      • maven添加依赖
      • 简单使用
      • 高级应用分组
        • 自定义分组
        • 组合分组
      • 源码地址

前言

JSR 303中提出了Bean Validation,表示JavaBean的校验,Hibernate Validation是其具体实现,并对其进行了一些扩展,添加了一些实用的自定义校验注解。

​ Spring中集成了这些内容,你可以在Spring中以原生的手段来使用校验功能,当然Spring也对其进行了一点简单的扩展,以便其更适用于Java web的开发。

实际开发可能会使用到分组校验

写得有点凌乱,大家自己体会吧

maven添加依赖

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

简单使用

针对form表单提交或者@RequestBody加了@Validated方式,
内部可以使用

    @ApiModelProperty(value = "用户主键", required = true)@NotNull(message = "用户主键不能为空", groups = UpdateGroup.class)@NotBlank(message = "用户名不能为空", groups = UpdateGroup.class)private String userId;@ApiModelProperty(value = "用户名", required = true)@NotNull(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})@NotBlank(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})private String userName;@NotNull(message = "密码不能为空", groups = {AddGroup.class, UpdateGroup.class})@NotBlank(message = "密码不能为空", groups = {AddGroup.class, UpdateGroup.class})@ApiModelProperty(value = "密码", required = true)private String password;@NotNull(message = "性别不能为空", groups = {AddGroup.class, UpdateGroup.class})@ApiModelProperty(value = "性别", required = true)private GenderEnum gender;

其中有很多日常使用的规则注解如@Email@Url等等
还有下面列举的一些常规的检查
在这里插入图片描述
这边也可以组合hibernate-validator校验注解
在这里插入图片描述

注意如果想使用嵌套对象需要使用@Valid注解可以进行嵌套校验

高级应用分组

自定义分组

比如我很多时候新增和修改的DTO只是存在主键或者其他的一些少量字段差异而已,但是自己又不想去CV
首先swagger可以使用来忽略api文档的显示

    @ApiOperationSupport(ignoreParameters = "xxx")
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {/*** Specify one or more validation groups to apply to the validation step* kicked off by this annotation.* <p>JSR-303 defines validation groups as custom annotations which an application declares* for the sole purpose of using them as type-safe group arguments, as implemented in* {@link org.springframework.validation.beanvalidation.SpringValidatorAdapter}.* <p>Other {@link org.springframework.validation.SmartValidator} implementations may* support class arguments in other ways as well.*/Class<?>[] value() default {};}

从源码可以知道@Validated支持组,那么我们就得去创建组比如我创建了
AddGroup

public interface AddGroup {}// 第二种写法
public interface AddGroup extends Default {}
组合分组

理论的东西或者跟深层次的东西可以看源码。
核心这些是通过BeanPostProcessor后置处理器实现的
这个可以定义注解生效的顺序

@Target({ TYPE })
@Retention(RUNTIME)
@Documented
public @interface GroupSequence {Class<?>[] value();
}
@GroupSequence({UpdateGroup.class, UpdateExpensiveGroup.class})
public interface ComplexUpdateGroup {}

这边可以定义分组顺序,上述先进行UpdateGroup,再去进行UpdateExpensiveGroup

实现自定义的校验器

public class ValidUserConstraintValidator implements ConstraintValidator<ValidUser, UserDTO> {@Autowiredprivate UserService userService;@Overridepublic boolean isValid(UserDTO userDTO, ConstraintValidatorContext context) {String validResult = this.userService.valid(userDTO);if (StringUtils.isBlank(validResult)) {return true;}context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(validResult).addConstraintViolation();return false;}
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Constraint(validatedBy = ValidUserConstraintValidator.class)
public @interface ValidUser {String message() default "用户已存在";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
@Data
@ApiModel("用户请求对象")
@ValidUser(groups = {AddGroup.class, UpdateGroup.class})
public class UserDTO implements Serializable {private static final long serialVersionUID = 6715147416524554153L;@ApiModelProperty(value = "用户主键", required = true)@NotNull(message = "用户主键不能为空", groups = UpdateGroup.class)@NotBlank(message = "用户名不能为空", groups = UpdateGroup.class)private String userId;@ApiModelProperty(value = "用户名", required = true)@NotNull(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})@NotBlank(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})private String userName;@NotNull(message = "密码不能为空", groups = {AddGroup.class, UpdateGroup.class})@NotBlank(message = "密码不能为空", groups = {AddGroup.class, UpdateGroup.class})@ApiModelProperty(value = "密码", required = true)private String password;@NotNull(message = "性别不能为空", groups = {AddGroup.class, UpdateGroup.class})@ApiModelProperty(value = "性别", required = true)private GenderEnum gender;public static User of(UserDTO userDTO) {return UserMapper.MAPPER.from(userDTO);}@Mapperinterface UserMapper {UserMapper MAPPER = Mappers.getMapper(UserMapper.class);/*** DTO转DO** @param userDTO DTO* @return DO*/User from(UserDTO userDTO);}
}

源码地址

https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-mybatis-plus-sample#mapstruct%E7%AE%80%E5%8C%96%E9%A2%86%E5%9F%9F%E5%AF%B9%E8%B1%A1dtodovo%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2

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

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

相关文章

SaaS智慧校园云平台源码,智慧班牌系统,家校互联小程序源码

SaaS智慧校园云平台源码&#xff0c;智慧班牌系统&#xff0c;原生小程序 集智慧教学、智慧教务、智慧校务、智慧办公于一体的校园管理平台源码。集成智能硬件及第三方服务&#xff0c;面向学校、教师、家长、学生&#xff0c;将校内外管理、教学等信息资源进行整合&#xff0c…

基于ip地址通过openssl生成自签名证书

最近在配置geo的时候&#xff0c;客户说自己使用的是自签证书&#xff0c;然后是通过ip地址和端口的方式访问gitlab&#xff0c;比较好奇这块&#xff0c;因此对证书的生成和使用做了一些整理&#xff0c;对此网上关于这部分资料也很多&#xff0c;不过作为记录&#xff0c;也算…

【扩散模型】6、Classifier-Free Diffusion Guidance | 无需显示分类器指导也能获得很好的生成效果

论文&#xff1a;Classifier-Free Diffusion Guidance 代码&#xff1a;暂无 出处&#xff1a;NIPS 2021 workshop&#xff08;短版本论文&#xff09; 一、背景 在此之前&#xff0c;classifier guidance &#xff08;diffusion model beats GAN&#xff09;模型使用类别引…

3A服务器 (hcia)

原理 认证&#xff1a;验证用户是否可以获得网络访问权。 授权&#xff1a;授权用户可以使用哪些服务。 计费&#xff1a;记录用户使用网络资源的情况 实验 步骤 1.配置ip地址 2.配置认证服务器 aaa authentication-scheme datacom&#xff08;认证服务器名字&#xf…

【ICCV2023】MMVP:基于运动矩阵的视频预测

目录 导读 本文方法 步骤1&#xff1a;空间特征提取 步骤2&#xff1a;运动矩阵的构造和预测 步骤3&#xff1a;未来帧的合成和解码 实验 实验结果 消融实验 结论 论文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Zhong_MMVP_Motion-Matrix…

音箱芯片系统案例分析

近年来&#xff0c;音箱市场需求日益增长&#xff0c;其轻便、时尚的外观和无线连接的便捷性深受消费者喜爱。音箱的电路图主要由以下几个部分组成&#xff1a;音频功放芯片 前置信号处理 运算放大器 稳压电源芯片 电平指示 音频功放芯片&#xff1a;D2668,D2025,D8227,D4520…

手机怎么下载python并安装,如何在手机上下载python

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何在手机上下载python 3.7版本&#xff0c;手机怎么下载python并安装&#xff0c;现在让我们一起来看看吧&#xff01; 如何在手机上下载python 应用市场内搜索下载下载Python在您开始之前&#xff0c;在你的计算机将…

Android应用-flutter使用Positioned将控件定位到底部中间

文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置&#xff0c;你可以使用MediaQuery来获取屏幕的高度&#xff0c;然后设置Positioned的bottom属性和left或right属性&#xff0c;一般我们left和right都会设置一个值让控制置于合适的位置&#xff0…

openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表

文章目录 openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表169.1 操作步骤 openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表 openGauss支持标准的数据库操作语言&#xff08…

基于YOLOv8深度学习的智能玉米害虫检测识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

一文弄懂kubernetes之Service

目录 ServiceService工作流程kube-proxyuserspaceiptablesIPVS EndpointsService负载分发策略Service属性Service定义多端口Service外部服务ServiceHeadless Services Service 在 kubernetes 中&#xff0c;Pod 是有生命周期的&#xff0c;如果 Pod 重启 IP 很有可能会发生变化…

MATLAB - 读取双摆上的 IMU 数据

系列文章目录 前言 本示例展示了如何从安装在双摆杆上的两个 IMU 传感器生成惯性测量单元 (IMU) 读数。双摆使用 Simscape Multibody™ 进行建模。有关使用 Simscape Multibody™ 构建简易摆的分步示例&#xff0c;请参阅简易摆建模&#xff08;Simscape Multibody&#xff09…