当前位置: 首页 > article >正文

自定义校验注解

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

1.自定义注解,并在注解上指定校验逻辑

@Constraint(validatedBy = StateValidation.class) // 指定校验逻辑

package com.example.demo.validation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * @author hrui
 * @date 2025/1/6 22:18
 */
@Documented//元注解
@Constraint(validatedBy = StateValidation.class) // 关联校验逻辑
@Target({ElementType.FIELD, ElementType.PARAMETER}) // 可用于字段和方法参数  //元注解
@Retention(RetentionPolicy.RUNTIME)//元注解
public @interface State {
     //自定义注解至少包含三个属性  分别是message  groups    payload
    String message() default "文章状态只能是 已发布 或 草稿";

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

    //通常用于将元数据传递给校验器,几乎不用在普通场景下
    Class<? extends Payload>[] payload() default {};
}

2.实现校验逻辑

自定义校验逻辑需要实现 ConstraintValidator 接口。该接口包含以下两个方法:

  1. initialize():用于初始化注解的属性。
  2. isValid():校验逻辑实现的核心方法。

package com.example.demo.validation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * @author hrui
 * @date 2025/1/6 22:19
 */
//ConstraintValidator<State, String> 第一个泛型是给哪个注解提供校验规则,第二个是校验的数据类型
public class StateValidation implements ConstraintValidator<State, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false; // 如果值为 null,校验失败
        }

        // 校验值是否为 "已发布" 或 "草稿"
        if (value.equals("已发布") || value.equals("草稿")) {
            return true; // 校验通过
        }

        return false; // 校验失败
    }
}

在需要使用的接口上  添加@Validated

注意引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

在全局异常处理中

 


http://www.kler.cn/a/469862.html

相关文章:

  • 设计模式——泛型单例类
  • 如何打开/处理大型dat文件?二进制格式.dat文件如何打开?Python读取.dat文件
  • nodeJS下npm和yarn的关系和区别详解
  • (leetcode算法题)面试题 17.19. 消失的两个数字
  • C语言的正则表达式
  • 清除数字栈
  • 文件上传漏洞 (网络安全)
  • Pytest 接口关联
  • 肘部法则确定聚类数
  • nginx: [emerg] host not found in upstream “host.docker.internal“
  • MPLS动态LSP配置实验
  • hot100_73. 矩阵置零
  • GitLab 创建项目、删除项目
  • 系统编程1.0-exec函数和exit()的使用
  • 《OpenCV 5.0.0-alpha:开启计算机视觉新篇章》
  • 在arm平台Euler系统上编译安装ffmpeg
  • [python]验证码识别库-DDDDOCR
  • CAM几何引擎简介
  • 目标检测算法-Picodet
  • 基于python大数据分析的高考志愿填报推荐系统实现
  • 决定系数(R²分数)——评估回归模型性能的一个指标
  • 【办公类-88-02】20250106批量读后感
  • Leetcode-234 回文链表
  • 飞牛fnOS如何通过docker安装宝塔面板
  • 基于Python深度学习【眼疾识别】系统设计与实现+人工智能+机器学习+TensorFlow算法
  • 1929-2024年全球气象站点逐日气象指标数据(气温、降水量、风速等12项)