已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)
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    payloadString message() default "文章状态只能是 已发布 或 草稿";Class<?>[] groups() default {};//通常用于将元数据传递给校验器,几乎不用在普通场景下Class<? extends Payload>[] payload() default {};
}
 
 
 
 
 
2.实现校验逻辑
自定义校验逻辑需要实现 ConstraintValidator 接口。该接口包含以下两个方法:
- initialize():用于初始化注解的属性。
- 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> {@Overridepublic 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>
在全局异常处理中

 