SpringValidation自定义注解以及分组校验

SpringValidation的参数校验使用可参考:【SpringMVC应用篇】Spring Validation 参数校验-CSDN博客

目录

[1. 引入依赖](#1. 引入依赖)

[2. 自定义注解校验](#2. 自定义注解校验)

[2.1 创建Validation类](#2.1 创建Validation类)

[2.2 创建注解对象](#2.2 创建注解对象)

[2.3 使用注解](#2.3 使用注解)

[3. 分组校验](#3. 分组校验)

[3.1 实体类内部定义接口](#3.1 实体类内部定义接口)

[3.2 在参数上指定分组](#3.2 在参数上指定分组)


1. 引入依赖

XML 复制代码
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
   <version>3.2.0</version>
</dependency>

2. 自定义注解校验

使用场景:已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)。 实现自定义注解可以通过模仿,SpringValidation提供的其他注解进行改写。

举例说明:

我有一个实体类,其中一个参数state需要接收到前端数据后进行校验(要求该参数只能是 已发布 或者 草稿)。而SpringValidation提供的注解无法满足我的需求,此时便需要自定义注解。

2.1 创建Validation类

**注意:**该类需要实现 ConstraintValidator 接口,并实现 isValid( ) 方法。方法内即是校验规则, 我这里只是提供参考。请自行根据业务需求更改。

java 复制代码
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * ConstraintValidator<State, String>前一个代表需要校验的注解,后一个代表校验类型
 */
public class Validation implements ConstraintValidator<State, String> {
    /**
     *
     * @param value 将来要校验的数据
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        //校验规则
        if (value == null) {
            return false;
        }
        if (value.equals("已发布") || value.equals("草稿")) {
            return true;
        }
        return false;
    }
}

2.2 创建注解对象

注解名称,请根据自己业务需求更改。

java 复制代码
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

@Documented //元注解,代表可在文档显示
@Constraint(
        validatedBy = {Validation.class} //指定提供校验规则的类,该类需要自己指定
)
//元注解,代表注解适用的对象(方法、字段、注解、类、属性)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME) //元注解,代表注解的作用范围
public @interface State {
    //报错提示
    String message() default "state参数只能是已发布或者草稿";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

2.3 使用注解

找到对应的实体类,在需要校验的参数上添加该注解即可。例如我这里需要对state进行校验。

3. 分组校验

分组校验是指把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项。
分组校验常用于增加和修改操作时对数据的校验。

分组校验的 流程:
**1.**定义分组
**2.**定义校验项时指定归属的分组
**3.**校验时指定要校验的分组

3.1 实体类内部定义接口

3.2 在参数上指定分组


3.3 给@Validated注解赋值

注意: 如果在方法上对参数进行校验,需要在类上添加@Validated注解 。如果在实体类中对成员遍历进行校验,需要在使用到这个类的接口方法中添加@Validated注解
最后最后!!!各位看官觉得有用就收藏、点赞、评论一下吧。我看到问题后,我会第一时间回复的!

相关推荐
Shadow(⊙o⊙)2 分钟前
mkfifo()命名管道-FIFO客户端 服务端模拟。*System V消息队列、信号量(信号灯)。
linux·运维·服务器·开发语言·c++
赵谨言6 分钟前
基于C#的在线编码与自动化测试全栈Web平台的设计与实现
开发语言·前端·c#
酉鬼女又兒7 分钟前
零基础入门计算机网络:点对点协议PPP、媒体接入控制基本概念、静态划分信道技术、CSMA/CD与CSMA/CA协议全面详解
服务器·网络·网络协议·计算机网络·职场和发展·求职招聘·媒体
Raink老师10 分钟前
【AI面试临阵磨枪-98】前端如何展示多模态流式输出:文字打字机 + 图片渐进 + 音频播放?
前端·人工智能·面试
AI_零食13 分钟前
奶茶大数据运维表 - 鸿蒙PC Electron框架技术实现详解
运维·前端·华为·electron·开源·harmonyos·鸿蒙
Shadow(⊙o⊙)14 分钟前
System V共享内存详解,shm系列接口,三种共享内存删除机制。System V通信缺点分析
linux·运维·服务器·开发语言·网络·c++
小雨下雨的雨15 分钟前
鸿蒙PC Electron框架实现流体气泡模拟器
前端·人工智能·算法·华为·electron·鸿蒙
ZC跨境爬虫16 分钟前
跟着 MDN 学JavaScript day_4:如何存储你需要的信息——变量
开发语言·前端·javascript·ui·ecmascript
星栈独行18 分钟前
10 分钟跑起第一个 Makepad 应用:先把窗口开起来
前端·程序人生·ui·rust·开源·github
万能的知了21 分钟前
服务器托管 vs 云主机 vs 裸金属:一张决策流程图
运维·服务器·网络