已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)
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 接口。该接口包含以下两个方法:
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> {
@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>
在全局异常处理中



















![[paddle] 非线性拟合问题的训练](https://i-blog.csdnimg.cn/direct/b47b5532436547d993f3eaacf168c578.png#pic_center)