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.