Hibernate-validator 6:@Max批注的奇怪行为,在Number字段上设置了BigDecimal

时间:2019-03-01 02:46:40

标签: hibernate-validator

我想我可能在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);
    }

}

“数字”字段中存储的BigDecimal即使大于1也不会触发约束异常。而像2.xxx这样的大十进制会这样。

感觉验证器不再(不再)考虑存储在Number中的BigDecimals对象中的逗号后的数字。

1 个答案:

答案 0 :(得分:2)

嗯,是的,我们这里有一个错误:当您像以前一样使用Number作为声明的类型时,我们最终会比较long。不过,这应该很容易解决。

我看到您填写了https://hibernate.atlassian.net/browse/HV-1699,我们将在此为您提供更新。

我将在发布修复程序后立即发布它,因为它肯定是不正确的。