Custom Validation Annotations
I. Background
Recently, while using javax.validation for validation, I found there was no annotation for validating BigDecimal types, so I created one myself.
II. Define Annotation and Validator Class
2.1 Annotation Class
@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 Validator Class
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;
}
}
III. Using the Annotation
public class Example {
/**
* Test field
*/
@BigDecimalRange(min = 0.1, max = 9.9, message = "The range of the test field is 0.1~9.9")
private BigDecimal testValue;
}