I avoided the double and float types and implemented a special validator that could check the BigDecimal value based on accuracy and scale.
Descriptor restrictions.
package constraintdescriptor; import constraintvalidator.BigDecimalRangeValidator; import java.lang.annotation.Documented; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; @Target({METHOD, FIELD, ANNOTATION_TYPE}) @Retention(RUNTIME) @Constraint(validatedBy = BigDecimalRangeValidator.class) @Documented public @interface BigDecimalRange { public String message() default "{java.math.BigDecimal.range.error}"; public Class<?>[] groups() default {}; public Class<? extends Payload>[] payload() default {}; long minPrecision() default Long.MIN_VALUE; long maxPrecision() default Long.MAX_VALUE; int scale() default 0; }
Validator of restrictions.
package constraintvalidator; import constraintdescriptor.BigDecimalRange; import java.math.BigDecimal; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public final class BigDecimalRangeValidator implements ConstraintValidator<BigDecimalRange, Object> { private long maxPrecision; private long minPrecision; private int scale; @Override public void initialize(final BigDecimalRange bigDecimalRange) { maxPrecision = bigDecimalRange.maxPrecision(); minPrecision = bigDecimalRange.minPrecision(); scale = bigDecimalRange.scale(); } @Override public boolean isValid(final Object object, final ConstraintValidatorContext cvc) { boolean isValid = false; if (object == null) {
This can be extended to other types when necessary.
Finally, in a bean, a property of type BigDecimal can be annotated with the annotation @BigDecimalRange as follows.
package validatorbeans; public final class WeightBean { @BigDecimalRange(minPrecision = 1, maxPrecision = 33, scale = 2, groups = {ValidationGroup.class}, message = "The precision and the scale should be less than or equal to 35 and 2 respectively.") private BigDecimal txtWeight;
Tiny
source share