【數據校驗】自定義註解

註解

驗證時間格式
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTime {

    String message() default "格式錯誤";

    String format() default "yyyy-MM-dd";

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

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

public class DateTimeValidator implements ConstraintValidator<DateTime, String> {

    private DateTime dateTime;

    /**
     * 初始化 可以獲得當前註解的所有屬性
     *
     * @param dateTime
     */
    @Override
    public void initialize(DateTime dateTime) {
        this.dateTime = dateTime;
    }

    /**
     * 進行約束驗證的主體方法
     *
     * @param s       標識驗證參數的具體實例
     * @param context 約束執行的上下文環境
     * @return
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext context) {
        if (StringUtils.isBlank(s)) {
            return true;
        }
        // 獲取定義的格式
        String format = dateTime.format();

        if (s.length() != format.length()) {
            return false;
        }

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            simpleDateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
        return true;

    }
}

輸入在List集合範圍內的整數數據
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ListIntegerValueValidator.class)
public @interface ListIntegerValue {
    @OverridesAttribute(constraint = Min.class, name = "value") long min() default 0;

    @OverridesAttribute(constraint = Max.class, name = "value") long max() default Long.MAX_VALUE;

    @OverridesAttribute(constraint = Max.class, name = "value") long regular() default Long.MAX_VALUE;
    String message() default "不在要求範圍之內";

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

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

public class ListIntegerValueValidator implements ConstraintValidator<ListIntegerValue, List<Integer>> {

    private ListIntegerValue listIntegerValue;

    /**
     * 初始化 可以獲得當前註解的所有屬性
     *
     * @param listIntegerValue
     */
    @Override
    public void initialize(ListIntegerValue listIntegerValue) {
        this.listIntegerValue = listIntegerValue;
    }

    /**
     * 進行約束驗證的主體方法
     *
     * @param integerList 標識驗證參數的具體實例
     * @param context     約束執行的上下文環境
     * @return
     */
    @Override
    public boolean isValid(List<Integer> integerList, ConstraintValidatorContext context) {
        if (integerList == null) {
            return true;
        }

        try {
            for (Integer i : integerList) {
                if ((i >= listIntegerValue.min() && i <= listIntegerValue.max()) || i == listIntegerValue.regular()) {
                    return true;
                }else{
                    return false;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }
}

輸入在List集合範圍內的字符串
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StringSeriesValidator.class)
public @interface StringSeries {

    String[] list();

    String message() default "無效的數據";

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

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

}

public class StringSeriesValidator implements ConstraintValidator<StringSeries, String> {

    private StringSeries series;

    @Override
    public void initialize(StringSeries series) {
        this.series = series;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null || series.list().length <= 0) {
            return true;
        }

        StringBuilder message = new StringBuilder();
        for (String str : series.list()) {
            if (value.equals(str)) {
                return true;
            }
            if (message.length() > 0) {
                message.append(",");
            }
            message.append(str);
        }

        // 重置錯誤提示信息 message
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate("數據不在{" + message + "}集合內").addConstraintViolation();
        return false;
    }
}

輸入在一定範圍內的整數

```java
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IntegerSeriesValidator.class)
public @interface IntegerSeries {

    int[] list();

    String message() default "無效的數據";

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

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

}

public class IntegerSeriesValidator implements ConstraintValidator<IntegerSeries, Integer> {

    private IntegerSeries series;

    @Override
    public void initialize(IntegerSeries series) {
        this.series = series;
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null || series.list().length <= 0) {
            return true;
        }

        StringBuilder message = new StringBuilder();
        for (int i : series.list()) {
            if (value == i) {
                return true;
            }
            if (message.length() > 0) {
                message.append(",");
            }
            message.append(i);
        }

        // 重置錯誤提示信息 message
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate("數據不在{" + message + "}集合內").addConstraintViolation();

        return false;
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章