實現(xiàn)自定義校驗注解,ConstraintValidator接口

一、Spring中的校驗注解

在spring的使用過程中,有一些現(xiàn)成的注解可以使用

Constraint 詳細(xì)信息
@AssertFalse 該值必須為False
@AssertTrue 該值必須為True
@DecimalMax(value,inclusive) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值 ,inclusive表示是否包含該值
@DecimalMin(value,inclusive) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值 ,inclusive表示是否包含該值
@Digits 限制必須為一個小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction
@Email 該值必須為郵箱格式
@Future 被注釋的元素必須是一個將來的日期
@FutureOrPresent 被注釋的元素必須是一個現(xiàn)在或?qū)淼娜掌?/td>
@Max(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Min(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@Negative 該值必須小于0
@NegativeOrZero 該值必須小于等于0
@NotBlank 該值不為空字符串,例如“ ”
@NotEmpty 該值不為空字符串
@NotNull 該值不為Null
@Null 該值必須為Null
@Past 被注釋的元素必須是一個過去的日期
@PastOrPresent 被注釋的元素必須是一個過去或現(xiàn)在的日期
@Pattern(regexp) 匹配正則
@Positive 該值必須大于0
@PositiveOrZero 該值必須大于等于0
@Size(min,max) 數(shù)組大小必須在[min,max]這個區(qū)間

二、自定義注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
    validatedBy = {MobileNoValidator.class}
)
public @interface MobileNo {
    String message() default "手機號格式不正確";

    boolean nullable() default false;

    boolean blankable() default false;

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

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

該自定義注解類中用到了四種元注解,最后一個注解@Constraint表示校驗此注解的校驗器類,可以多個。值得一提的是除了自定義的message、nullable和blankable屬性外,下面的groups和payload也是必須添加的。

三、注解校驗類

public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {
    private boolean nullable;
    private boolean blankable;
    private String message;

    public MobileNoValidator() {
    }

    @Override
    public void initialize(MobileNo constraintAnnotation) {
        this.nullable = constraintAnnotation.nullable();
        this.message = constraintAnnotation.message();
        this.blankable = constraintAnnotation.blankable();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            if (!this.nullable) {
                //禁止默認(rèn)消息返回
                context.disableDefaultConstraintViolation();
                //自定義返回消息
                context.buildConstraintViolationWithTemplate("手機號不能為空").addConstraintViolation();
                return false;
            } else {
                return true;
            }
        } else if (value.length() == 0) {
            if (!this.blankable) {
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate("手機號不能為空白").addConstraintViolation();
                return false;
            } else {
                return true;
            }
        } else if (!AppUtils.isMobile(value)) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate((String)StringUtils.defaultIfBlank(this.message, "手機號格式不對")).addConstraintViolation();
            return false;
        } else {
            return true;
        }
    }
}

該接口使用了泛型,第一個參數(shù)是自定義注解類,第二個是要校驗的數(shù)據(jù)類型
重寫的兩個方法,initialize為初始化方法,可以在里面做一些初始化操作,isValid方法寫我們自定義的校驗邏輯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容