SpringBoot中自定義注解


那用戶注冊的時候,判斷用戶輸入的兩次密碼是否一致舉例子:

1、創建注解類  PasswordEqual

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
    // 注意在注解中只能使用基本類型不能使用包裝類型
    int min() default 1;

    int max() default 10;

    String message() default "兩次密碼不一致";

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

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

    // 關聯類
}

說明:min() 和 max() 是用來接收該注解傳入的參數

2、創建 關聯類,用於編寫業務邏輯

/**
 * 自定義注解 @PasswordEqual 的關聯類, 用於校驗兩次輸入的面是否一致
 * <p>
 * ConstraintValidator 接口的第一個參數傳入的是自定義注解的類型,
 * 第二個參數傳入的是自定義注解修飾的目標的類型
 * <p>
 * 例如:
 *
 * @PasswordEqual public class PersonDTO {
 * private String name;
 * }
 * 那么第二個參數傳入的就是 PersonDTO
 * <p>
 * 例如:
 * public class PersonDTO {
 * @PasswordEqual private String name;
 * }
 * 那么第二個參數傳入的就是 String
 */
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> {
    // 用於接收自定義注解中的參數
    private int min;
    private int max;

    /**
     * 如果要實現接收參數,則必須要重寫這個方法
     *
     * @param constraintAnnotation 通過該參數的方法可以獲取到自定義注解中的參數
     */
    @Override
    public void initialize(PasswordEqual constraintAnnotation) {
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }

    /**
     * 要將自定義注解和關聯類關聯起來必須要實現 isValid(),校驗邏輯就是這里實現
     *
     * @param personDTO                  自定義注解修飾目標的類型
     * @param constraintValidatorContext 關聯類與注解
     * @return 是否合法
     */
    @Override
    public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
        String password1 = personDTO.getPassword1();
        String password2 = personDTO.getPassword2();

        if (password1.length() < this.min || password2.length() > this.max) {
            return false;
        }

        if (!StringUtils.isBlank(password1) && !StringUtils.isBlank(password2)) {
            return password1.equals(password2);
        }

        return false;
    }
}

3、在DTO上打上注解

@Builder
@Getter
@Setter
@PasswordEqual(min = 6, max = 8)
public class PersonDTO {
    @Length(min = 4, max = 12, message = "姓名長度只能在4-12字符之間")
    @NonNull
    private String name;
    private Integer age;

    private String password1;
    private String password2;
}

4、關聯自定義注解與關聯類,通過 @Constraint(validatedBy = PasswordValidator.class) 即可關聯成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM