Hibernate-validator 6:在 Number 字段上设置 BigDecimal 的 @Max 注释的奇怪行为
Hibernate-validator 6: Weird behavior of the @Max annotation with a BigDecimal set on a Number field
我想我可能在 hibernate-validator 6.0.15.Final 中发现了一个奇怪的地方。它曾经与版本 5.4.2.Final.
一起使用
这是一个测试示例:
import lombok.Data;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Max;
import java.math.BigDecimal;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
public class ValidTest {
@Data
static class ClassToValidate{
public ClassToValidate() {
failingNumber = new BigDecimal("1.001");
failingBigDecimal = new BigDecimal("1.001");
passingNumber = new BigDecimal("0.001");
passingBigDecimal = new BigDecimal("0.001");
}
@Max(1)
private Number failingNumber;
@Max(1)
private BigDecimal failingBigDecimal;
@Max(1)
private Number passingNumber;
@Max(1)
private BigDecimal passingBigDecimal;
}
@Test
public void test(){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<ClassToValidate>> violations = validator
.validate(new ClassToValidate());
for (ConstraintViolation<ClassToValidate> violation : violations) {
System.out.println(violation);
}
assertThat(violations).hasSize(2);
}
}
存储在 Number 字段中的 BigDecimal 不会触发约束异常,即使它大于 1。而像 2.xxx 这样的 bigdecimal 会。
感觉验证器(不再)考虑存储在 Number 中的 BigDecimals 对象中逗号后的数字。
嗯,你是对的,我们这里有一个错误:当你像你一样使用 Number 作为声明的类型时,我们最终会比较 long。不过这应该很容易解决。
我看到你填写了 https://hibernate.atlassian.net/browse/HV-1699 ,我们会在那里给你更新。
我会在修复后立即发布,因为它肯定是一个错误。
使用 Java Bean Validation ,您可以使用三种替代 BigDecimal 类型:
@DecimalMax --->
样本:
@DecimalMax("30.00")
BigDecimal 折扣;
@DecimalMin --->
样本:
@DecimalMin("5.00")
BigDecimal 折扣;
@Digits --->
样本:
@Digits(整数=6,分数=2)
BigDecimal 价格;
注意:
您只能将 @Max 用于 整数 值。
我想我可能在 hibernate-validator 6.0.15.Final 中发现了一个奇怪的地方。它曾经与版本 5.4.2.Final.
一起使用这是一个测试示例:
import lombok.Data;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Max;
import java.math.BigDecimal;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
public class ValidTest {
@Data
static class ClassToValidate{
public ClassToValidate() {
failingNumber = new BigDecimal("1.001");
failingBigDecimal = new BigDecimal("1.001");
passingNumber = new BigDecimal("0.001");
passingBigDecimal = new BigDecimal("0.001");
}
@Max(1)
private Number failingNumber;
@Max(1)
private BigDecimal failingBigDecimal;
@Max(1)
private Number passingNumber;
@Max(1)
private BigDecimal passingBigDecimal;
}
@Test
public void test(){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<ClassToValidate>> violations = validator
.validate(new ClassToValidate());
for (ConstraintViolation<ClassToValidate> violation : violations) {
System.out.println(violation);
}
assertThat(violations).hasSize(2);
}
}
存储在 Number 字段中的 BigDecimal 不会触发约束异常,即使它大于 1。而像 2.xxx 这样的 bigdecimal 会。
感觉验证器(不再)考虑存储在 Number 中的 BigDecimals 对象中逗号后的数字。
嗯,你是对的,我们这里有一个错误:当你像你一样使用 Number 作为声明的类型时,我们最终会比较 long。不过这应该很容易解决。
我看到你填写了 https://hibernate.atlassian.net/browse/HV-1699 ,我们会在那里给你更新。
我会在修复后立即发布,因为它肯定是一个错误。
使用 Java Bean Validation ,您可以使用三种替代 BigDecimal 类型:
@DecimalMax ---> 样本: @DecimalMax("30.00") BigDecimal 折扣;
@DecimalMin ---> 样本: @DecimalMin("5.00") BigDecimal 折扣;
@Digits ---> 样本: @Digits(整数=6,分数=2) BigDecimal 价格;
注意: 您只能将 @Max 用于 整数 值。