1. 程式人生 > >Hibernate Validation自定義註解校驗

Hibernate Validation自定義註解校驗

權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/cccmercy/article/details/79105624

  1. 情景:需要對String型別的屬性比如description進行驗證,驗證規則是當description為空時不進行正則校驗,description不為空時進行正則校驗。上述需求Hibernate Validation沒有可用於上述需求的註解,故自定義一個註解並自定義校驗規則。

  2. 自定義註解進行校驗的步驟

    • 寫一個校驗註解,在註解中指定校驗器類,校驗註解與校驗器一般一一對應。
    • 寫一個校驗器類並在校驗器類中寫校驗邏輯,校驗器必須實現ConstraintValidator<?, ?>
      介面,第一個引數是對應的註解,第二個引數是要校驗的屬性的型別
  3. 程式碼示例 校驗註解
package com.kunlun.validation.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import com.kunlun.validation.validator.KlPatternValidator;

/**
 * 自定義的校驗註解
 * 規則:
 *  1.如果字串為空串或者為null,則不進行正則校驗
 *  2.如果字串不為空串,則必須進行正則校驗
 * @author xc
 * @date 2018年1月19日上午11:38:02
 */
@Documented
// 指定該註解可以使用的地方
@Target(value= {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 指定實際進行校驗的校驗器,該校驗器是自己寫的且必須實現ConstraintValidator介面
@Constraint(validatedBy=KlPatternValidator.class)
public @interface KlPattern {
    /*
     * 用於驗證的註解下列這三個方法必須要,這是Hibernate Validation框架要求的,否則程式再在呼叫的時候會報錯
     * default用於對屬性給定預設值
     *  如果不給定預設值,則在使用註解的時候必須給屬性指定屬性值,否則報錯
     *  給定預設值時,在使用註解的時候可以不用指定屬性值
     */
    String message() default "不符合正則!";

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

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

    // 沒加default給定預設值,使用註解的時候該屬性必須賦值,否則報錯
    String regex();
    // value屬性,加上了default "mercy" 使得該屬性在使用註解的時候可以不用輸入也不會報錯
    String value() default "mercy";
}

與上面校驗註解對應的校驗器類

package com.kunlun.validation.validator;

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

import com.kunlun.validation.annotation.KlPattern;

/**
 * KlPatternValidator是KlPattern註解實際呼叫的驗證器
 * 在KlPatternValidator中完成校驗邏輯
 * 
 * @author xc
 * @date 2018年1月19日上午11:44:38
 */
public class KlPatternValidator implements ConstraintValidator<KlPattern, String> {

    private String regex;

    /**
     * 通過initialize()可以獲取註解裡的屬性值
     */
    @Override
    public void initialize(KlPattern constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        regex = constraintAnnotation.regex();
    }

    /**
     * 實際驗證邏輯
     *  返回值為true表示驗證通過,
     *  返回值為false表示驗證未通過
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext ctx) {

        // 當前前端傳過來的請求引數是空串,或者沒傳的時候,不進行後續正則校驗
        if ("".equals(s) || s == null) {
            return true;
        }

        // 進行正則校驗
        if(s.matches(regex)) {
            return true;
        }

        return false;
    }

}