java入參校驗——枚舉類型


一般來講,對一些post請求,我們可以使用@valid+javax.validation.constraints包下注解的方式,優雅把參數驗證放在control層的requst中,舉例說明如下圖:

 

 

 

 

 

 但是此時,如果我們知道可以修改的狀態只能為枚舉類中存在的值,並沒有已有的注解可以用,我們可以采用以下代碼來實現此功能:

首先我們自己實現一個驗證注解,具體代碼如下

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {

    String message() default "";

    // 作用參考@Validated和@Valid的區別
    Class<?>[] groups() default {};

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

    /**
     * 目標枚舉類
     */
    Class<?> target() default Class.class;

    /**
     * 是否忽略空值
     */
    boolean ignoreEmpty() default true;
}

可以的看到上面的注解上,使用了EnumValidator類進行校驗,實際上EnumValidator類實現一個ConstraintValidator接口,並在實現isValid與initialize方法,具體代碼如下:

public class EnumValidator implements ConstraintValidator<EnumValid, Integer> {

    // 枚舉校驗注解
    private EnumValid annotation;

    @Override
    public void initialize(EnumValid constraintAnnotation) {

        annotation = constraintAnnotation;
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        boolean result = false;

        Class<?> cls = annotation.target();
        boolean ignoreEmpty = annotation.ignoreEmpty();

        // target為枚舉,並且value有值,或者不忽視空值,才進行校驗
        if (cls.isEnum() && (value != null || !ignoreEmpty)) {

            Object[] objects = cls.getEnumConstants();
            for (Object obj : objects) {
                // 使用此注解的枚舉類需要重寫toString方法,改為需要驗證的值
                if (obj.toString().equals(String.valueOf(value))) {
                    result = true;
                    break;
                }
            }
        } else {
            result = true;
        }
        return result;
    }
}

完成以上代碼,由於ConstraintValidator的類型指定為Integer,所以要求枚舉中的要校驗的值只能為integer型。最后還需要在要使用注解的枚舉中重寫tostring方法,如下圖:

 

 

 完成上述配置后,我們就可以在代碼中使用了,具體如下圖:

 

 


免責聲明!

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



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