已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)
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>
在全局异常处理中