Hibernate @Digits Validation для типа Double

Я пытаюсь подтвердить Double поле с помощью API проверки Hibernate - используя @Digits аннотирование

<areaLength>0</areaLength>
<buildArea>0.0</buildArea>

@Digits(integer=10, fraction=0)
private Long areaLength = null; // Here areaLength = 0 

@Digits(integer=20, fraction=0)
private Double buildArea = null; // Here buildArea = 0.0

Вот areaLength не имеет нарушения ограничений,

но buildArea получает нарушение ограничения, говоря

buildArea numeric value out of bounds (<20 digits>.<0 digits> expected)

Нарушения за 10.0 нет, но получаются за 0.0.

Кто-нибудь знает причину?

Полный код:

public class ValidationTest {

    public static void main(String a[]) {
        Vehicle vehBean = new Vehicle();
        try {
            if (vehBean != null) {
                ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
                Validator validator = factory.getValidator();
                Set<ConstraintViolation<Vehicle>> violations = validator.validate(vehBean);
                if (violations!= null && violations.size() > 0) {
                    for (ConstraintViolation<Vehicle> violation : violations) {
                        System.out.println("Validation problem : " + violation.getMessage());
                    }
                }
            }
        } catch(Exception e) {
            throw e;
        }
    }
}

class Vehicle {
    @Digits(integer=20, fraction=0)
    private Double buildArea = 0.0; 
}

Проблема проверки: числовое значение выходит за границы (ожидается<20 цифр>.<0 цифр>)

3 ответа

Решение

Вы ограничили количество цифр для дробной части до 0 что означает, что дробь не допускается, даже если в вашей 0.0 но вы должны подтвердить, что это так, я думаю, у вас есть Double значение, которое 0 < x < 0.1 Вы также можете попробовать использовать Float для того же поля, и проверьте, если это имеет те же проблемы?

Значение поля или свойства должно быть числом в указанном диапазоне. Целочисленный элемент задает максимальные целые цифры для числа, а элемент дроби задает максимальные дробные цифры для числа.

источник

В качестве альтернативы, вы можете попробовать;

@DecimalMin("0.00") 
@DecimalMax("99999999999999999.00") 

Я думаю, что главной проблемой здесь с buildArea является его тип данных Double.

https://www.owasp.org/index.php/Bean_Validation_Cheat_Sheet

ссылка выше говорит, что тип данных, разрешенный @Digits, не поддерживает Double.

Я не понимаю Если у вас есть 1 цифра в дробной части, как 0.0почему вы ограничиваете в @Digits с fraction=0? Это ограничение хочет гарантировать, что у вас нет десятичных дробей, поэтому в вашем случае допустимы только целые числа.

Это действительно:

@Digits(integer=10, fraction=1)
private Double double1 = 0.0;

Это также верно:

@Digits(integer=10, fraction=0)
private Integer integer1 = 0;

Но это не верно

@Digits(integer=10, fraction=0)
private Double double1 = 0.0; // Double not allowing a fraction part = integer, so you must change type here.
Другие вопросы по тегам