autorenew

自定义校验注解

一、背景

近期在用 javax.validation 做校验的时候发现没有对 BigDecimal 类型进行校验的注解,便自己动手写了一个。

二、定义注解及校验类

2.1 注解类

@Documented
@Constraint(validatedBy = BigDecimalRangeValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalRange {
    double min() default Double.MIN_VALUE;

    double max() default Double.MAX_VALUE;

    String message() default "Validation failed";

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

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

2.2 校验类

public class BigDecimalRangeValidator implements ConstraintValidator<BigDecimalRange, BigDecimal> {

    private BigDecimal minValue;
    private BigDecimal maxValue;

    @Override
    public void initialize(BigDecimalRange constraintAnnotation) {
        minValue = new BigDecimal(constraintAnnotation.min());
        maxValue = new BigDecimal(constraintAnnotation.max());
    }

    @Override
    public boolean isValid(BigDecimal value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) {
            return true;
        }
        return value.compareTo(minValue) >= 0 && value.compareTo(maxValue) <= 0;
    }
}

三、使用注解

public class Example {

    /**
     * 测试字段
     */
    @BigDecimalRange(min = 0.1, max = 9.9, message = "测试字段的范围为0.1~9.9")
    private BigDecimal testValue;
}