Traemos la mejor respuesta que descubrimos por todo internet. Esperamos que te resulte útil y si deseas aportar algo que nos pueda ayudar a perfeccionar nuestra información hazlo con total libertad.
Puede usar la anotación, pero puede obtener false resultados dependiendo. Este es un problema general con los dobles y, en mi opinión, en muchos casos se deben evitar los _Double_s. ¿Quizás cambiar a un tipo diferente es la mejor solución? BigDecimal ¿por ejemplo?
Si ha cambiado a BigDecimal (o BigInteger), puede usar @DecimalMin o @DecimalMax. Pero esto todavía no es una solución para float o double.
he evitado la double
y el float
tipos e implementó un validador personalizado que podría validar un BigDecimal
valor basado en la precisión y la escala.
El descriptor de restricción.
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;
El validador de restricciones.
package constraintvalidator;
import constraintdescriptor.BigDecimalRange;
import java.math.BigDecimal;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public final class BigDecimalRangeValidator implements ConstraintValidator
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 should be validated by the not null validator (@NotNull).
isValid = true;
else if (object instanceof BigDecimal)
BigDecimal bigDecimal = new BigDecimal(object.toString());
int actualPrecision = bigDecimal.precision();
int actualScale = bigDecimal.scale();
isValid = actualPrecision >= minPrecision && actualPrecision <= maxPrecision && actualScale <= scale;
if (!isValid)
cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("Precision expected (minimun : " + minPrecision + ", maximum : " + maxPrecision + "). Maximum scale expected : " + scale + ". Found precision : " + actualPrecision + ", scale : " + actualScale).addConstraintViolation();
return isValid;
Esto podría extenderse a otros tipos también, cuando sea necesario.
Y finalmente en el bean, la propiedad del tipo BigDecimal
podría ser anotado por el @BigDecimalRange
anotación de la siguiente manera.
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; // Getter and setter.
public interface ValidationGroup
Nos encantaría que puedieras compartir este enunciado si te fue de ayuda.