Saltar al contenido

Validación de valores dobles y flotantes usando Hibernate Validator – validación de bean

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[] 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *