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