第二章 SpringBoot项目构建 - Java Bean Validation自定义校验注解(ConstraintValidator)

一、序言

ConstraintValidatorSpring 和 Java Bean Validation(也称为 JSR 380 或 Hibernate Validator)框架中用于创建自定义验证器的接口。它允许自定义验证逻辑,用于检查字段或方法参数是否符合特定的约束条件。

二、配置依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

三、使用ConstraintValidator创建自定义验证器

要使用 ConstraintValidator 创建自定义验证器,需要执行以下步骤:

  1. 定义自定义注解:创建一个自定义的注解来表示需要验证的约束。
  2. 实现 ConstraintValidator 接口:创建一个类实现 ConstraintValidator 接口,定义验证逻辑。
  3. 应用自定义注解:在需要验证的字段或方法参数上使用自定义注解。

使用详解

1.自定义注解

定义一个自定义注解@Mobile

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义注解的定义
@Constraint(validatedBy = MobileValidator.class)
@Target({ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER,
        ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Mobile {

    String message() default "手机号码格式不正确";

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

    Class<? extends Payload>[] payload() default {};

}

解释:

  • @Constraint:该注解标注了这个注解是一个验证注解,validatedBy 参数指定了实现验证逻辑的类(即 MobileValidator-自定义校验逻辑类,后面会详细讲解)。

  • @Target:指定了注解的目标(例如字段或方法参数)。

    • ElemenetType.CONSTRUCTOR - 构造器声明

    • ElemenetType.FIELD - 域声明(包括 enum 实例)

    • ElemenetType.LOCAL_VARIABLE 局部变量声明

    • ElemenetType.METHOD 方法声明

    • ElemenetType.PACKAGE 包声明

    • ElemenetType.PARAMETER 参数声明

    • ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

  • @Retention:指定了注解的保留策略(运行时保留,表示在运行时也可以访问到该注解)。

    • RetentionPolicy.SOURCE - 注解将被编译器丢弃

    • RetentionPolicy.CLASS - 注解在class文件中可用,但会被VM丢弃

    • RetentionPolicy.RUNTIME - VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

2. 实现 ConstraintValidator 接口
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.util.Objects;

public class MobileValidator implements ConstraintValidator<Mobile, String> {
    @Override
    public void initialize(Mobile constraintAnnotation) {
        // 初始化方法,可以获取注解中的值,通常情况下可以留空
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果手机号为空,默认不校验,即校验通过
        // TODO 根据自己的业务需求,可以在这里添加手机号校验逻辑 ,比如正则表达式
        return Objects.equals(value, "188111111111") || Objects.isNull(value);
    }
}

解释:

  • initialize() 方法:可以用来进行一些初始化操作,通常可以留空。
  • isValid() 方法:包含实际的验证逻辑。这个方法返回一个布尔值,表示验证是否通过。
3.应用自定义注解

在需要验证的字段或方法参数上使用自定义注解:

import com.server.validation.Mobile;

public class MobileDo {

    @Mobile(message = "手机号格式不正确")
    private String mobile;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}

四、使用示例

在这里插入图片描述
Controller调用示例:

import com.server.pojo.MobileDo;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@Validated
public class PacketCaptureController {
    
    @PostMapping("/test")
    public String checkService(@Valid @RequestBody MobileDo mobileDo) {
        return "测试成功!!";
    }
}

五、总结

通过定义自定义注解和实现 ConstraintValidator 接口,您可以在 Spring 中轻松创建自定义的验证逻辑。这使得您的代码更具可读性,并且能够灵活地实现复杂的验证需求。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值