spring-validation实现分组校验

news2024/9/21 10:54:36

文章目录

    • 前言
    • 实际开发可能会使用到分组校验
      • 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> {
    @Autowired
    private UserService userService;

    @Override
    public 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);
    }

    @Mapper
    interface 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.coloradmin.cn/o/1325699.html

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

相关文章

WEB绘图插件Canvas基础应用

一、概述 canvas 是 html5 标准中提供的⼀个标签 顾名思义是定义在浏览器上的画布&#xff0c;通过其强大的绘图接口&#xff0c;我们可以实现各种各样的图形&#xff0c; 炫酷的动画 &#xff0c;甚至可以利用他开发⼩游戏&#xff0c;包括市面上很流行的数据可视化框架底层都…

【新手必看】PyCharm2023免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

logback.xml

logback.xml <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 日志存放路径 --><property name"log.path" value"./logs" /><!-- 日志输出格式 --><property name"log.pattern&q…

释放潜力:前端开发者转向鸿蒙的必备建议

如果需要JavaScript知识点可以去我的主要观看 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&am…

【离散数学】——期末刷题题库(图论应用题)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

力扣:203. 移除链表元素(Python3)

题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 …

Windows 截图工具①FastStone Capture ②PixPin

​ 今天说说Windows好用的载图软件&#xff1a; 2023年12月21日&#xff0c;更新新增 PixPin 2款超级好用的截图软件&#xff0c;不止是载图、编辑、录屏、Gif等好用的功能&#xff0c;本人一直也在用。 ①FastStone Capture ②PixPin 软件介绍&#xff1a;FastStone Fast…

2024年【公路水运工程施工企业安全生产管理人员】考试题及公路水运工程施工企业安全生产管理人员报名考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【公路水运工程施工企业安全生产管理人员】考试题及公路水运工程施工企业安全生产管理人员报名考试&#xff0c;包含公路水运工程施工企业安全生产管理人员考试题答案和解析及公路水运工程施工企业安全生产管理…

还在用nvm?来试试更快的node版本管理工具——fnm

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是node版本管理 常见的node版本管理工具 fnm是什么 安装fnm …

4+miRNA+机器学习生信思路,常规又简单的miRNA也能发4+

今天给同学们分享一篇生信文章“Machine learning algorithms reveal potential miRNAs biomarkers in gastric cancer”&#xff0c;这篇文章发表在Sci Rep期刊上&#xff0c;影响因子为4.6。 结果解读&#xff1a; 数据来源 本研究包括348名男性&#xff08;占64.9%&#x…

解析资产管理的革新之路:从手工盘点到易点易动RFID散步式方案

随着科技的不断进步和应用&#xff0c;资产管理领域也在不断演进和革新。从最初的手工盘点到现代的智能化解决方案&#xff0c;我们目睹了资产管理的巨大变革。其中&#xff0c;易点易动RFID散步式方案以其高效、准确和便捷的特点&#xff0c;正在成为资产管理的新宠。本文将深…

Linux之yum管理器

目录 yum管理器 yum相关指令 yum list yum list | grep yum install yum remove 拓展 1.yum install -y man-pages 2.切换yum源 3.yum install -y epel-release 4. yum install -y lrzsz rz指令 sz指令 在window系统上&#xff0c;我们会在电脑自带的应用商…

Android Studio使用Genymotion

1. Genymotion介绍 GenyMotion速度之快令人发指&#xff0c;模拟效果堪比真机调试&#xff0c;支持绝大部分的模拟器功能&#xff0c;甚至包括语音&#xff0c;Google Now&#xff0c;支持eclipse, android studio。非常适合用来开发和演示效果。 2. Genymotion下载 Genymotio…

上 GitHub 热榜,星星暴涨,这个项目相继超越了 Archery, Flyway 和 Yearning

「 登上 GitHub Trending 星星超越 Yearning 键盘的敲击不停 传播开发的福音 」⚡️ Bytebase 是一款面向开发和 DBA 的一站式数据库 CI/CD 工具。它的所有代码都开源在 GitHub 上。GitHub 也是我们触达全球用户的核心阵地。虽然 GitHub Star 数一直是一个饱受争议的指标&a…

深度学习模型压缩方法:剪枝方法分类介绍

本文将介绍深度学习模型压缩方法中的剪枝,内容从剪枝简介、剪枝步骤、结构化剪枝与非结构化剪枝、静态剪枝与动态剪枝、硬剪枝与软剪枝等五个部分展开。 一、剪枝简介 在介绍剪枝之前,首先介绍过参数化这个概念,过参数化主要是指在训练阶段,在数学上需要进行大量的微分求解…

外贸函电开发信模板?写客户开发邮件方法?

如何写好外贸函电开发信&#xff1f;英语函电中的开发信怎么写&#xff1f; 在国际贸易中&#xff0c;外贸函电开发信扮演着至关重要的角色。这是一种有效的沟通工具&#xff0c;用来建立和维护与潜在客户或合作伙伴的联系。在这篇文章中&#xff0c;蜂邮将为您提供一个外贸函…

数字化营销的未来:TikTok在圣诞季的流量引爆与转化

随着数字化时代的发展&#xff0c;社交媒体平台成为品牌数字营销不可或缺的一部分。而TikTok&#xff0c;以其独特的短视频形式和强大的用户基础&#xff0c;正逐渐崭露头角。本文将探讨TikTok在圣诞季的数字化营销策略&#xff0c;着重分析流量的引爆和转化&#xff0c;以及数…

深入了解 npm 命令

目录 前言1 初始化项目2 安装依赖3 更新依赖4 发布包5 卸载包6 查看依赖7 运行脚本8 包搜索9 查看包信息结语 前言 在现代 Web 开发中&#xff0c;JavaScript 是一种至关重要的语言&#xff0c;而 npm&#xff08;Node Package Manager&#xff09;作为 Node.js 平台的默认软件…

@WebParam(name = “param“) 这个注解的作用

WebParam 是 JAX-WS&#xff08;Java API for XML Web Services&#xff09;中的一个注解&#xff0c;用于定义 Web 服务操作中参数的详细信息。这个注解主要用于 Web 服务方法的参数上&#xff0c;以提供有关如何映射和处理这些参数的额外信息。 主要用途 指定参数名称&#…

图像卷积操作

目录 一、互相关运算 二、卷积层 三、图像中目标的边缘检测 四、学习卷积核 五、特征映射和感受野 一、互相关运算 严格来说&#xff0c;卷积层是个错误的叫法&#xff0c;因为它所表达的运算其实是互相关运算&#xff08;cross-correlation&#xff09;&#xff0c;而不是…