一、序言
ConstraintValidator
是 Spring
和 Java Bean Validation(也称为 JSR 380 或 Hibernate Validator
)框架中用于创建自定义验证器的接口。它允许自定义验证逻辑,用于检查字段或方法参数是否符合特定的约束条件。
二、配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
三、使用ConstraintValidator
创建自定义验证器
要使用 ConstraintValidator
创建自定义验证器,需要执行以下步骤:
- 定义自定义注解:创建一个自定义的注解来表示需要验证的约束。
- 实现
ConstraintValidator
接口:创建一个类实现ConstraintValidator 接口
,定义验证逻辑。 - 应用自定义注解:在需要验证的字段或方法参数上使用自定义注解。
使用详解
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
中轻松创建自定义的验证逻辑。这使得您的代码更具可读性,并且能够灵活地实现复杂的验证需求。