返回

更加灵活的参数校验,Spring-boot自定义参数校验注解

开发工具

自定义参数校验注解:让 Spring Boot 校验更灵活

简介

Spring Boot 中内置了许多参数校验注解,如 @NotEmpty@NotNull@Pattern。然而,在某些情况下,我们需要更加复杂的校验规则。此时,自定义参数校验注解就派上用场了。

实现步骤

1. 创建自定义注解

首先,创建一个自定义注解类,例如 @PasswordEqual,用于校验两个字符串是否相等。这个注解包含以下内容:

  • @Documented:表示该注解可被 Javadoc 工具记录。
  • @Constraint:表明这是一个校验注解,并指定其关联类(PasswordValidator)。
  • @Target:指定注解可以被标记在哪些位置,如参数或字段上。
  • @Retention:表示注解在何时被使用,如运行时。
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
    String message() default "PasswordEqual";

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

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

    String field();

    String fieldMessage() default "";
}

2. 实现注解关联类

接下来,实现 PasswordValidator 类,该类用于执行校验逻辑:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PasswordValidator implements ConstraintValidator<PasswordEqual, String> {

    private String field;
    private String fieldMessage;

    @Override
    public void initialize(PasswordEqual constraintAnnotation) {
        this.field = constraintAnnotation.field();
        this.fieldMessage = constraintAnnotation.fieldMessage();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        try {
            // 获取其他字段的值
            Object fieldValue = getFieldValue(context.getRootBeanClass(), context.getRootBean(), field);

            // 校验两个字符串是否相等
            return Objects.equals(value, fieldValue);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private Object getFieldValue(Class<?> clazz, Object object, String fieldName) throws NoSuchFieldException, IllegalAccessException {
        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        return field.get(object);
    }
}

3. 使用自定义注解

最后,可以在参数或字段上使用自定义注解,例如:

@PostMapping("/register")
public String register(@Valid @RequestBody User user) {
    // 省略代码
}

在此处,@Valid 注解表示需要对 User 对象进行校验,而 @PasswordEqual 注解则用于校验密码和确认密码是否相等。

结语

Spring Boot 的自定义参数校验注解提供了极大的灵活性,允许我们创建复杂且定制化的校验规则,从而确保数据的完整性和可靠性。

常见问题解答

1. 自定义注解的优势是什么?

自定义注解可以处理内置注解无法处理的复杂校验规则。

2. 如何编写一个有效的自定义注解?

遵守 @Documented@Constraint@Target@Retention 等注解。

3. 如何实现注解关联类?

关联类用于执行校验逻辑,需要实现 ConstraintValidator 接口。

4. 如何使用自定义注解?

可以在参数、字段或方法上使用自定义注解,并使用 @Valid 注解进行校验。

5. 自定义注解有哪些常见的用例?

自定义注解可用于校验密码强度、电子邮件格式和枚举值。