Hibernate-validator 6:@max注释的怪异行为,具有数字字段上的bigdecimal设置



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

即使大于1大于1的数字字段中存储的bigdecimal也不会触发约束异常。

感觉验证器不再考虑了存储在数字中的bigdecimals中的逗号之后的数字。

嗡嗡声,您是对的,我们在这里有一个错误:当您像您一样使用数字作为声明的类型时,我们最终会比较longs。

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

我将在我们有修复的情况下立即发布,因为这绝对是一个不好的问题。

带有Java bean验证,您可以使用三个替代方案用于bigdecimal类型:

  1. @decimalmax --->样本:@decimalmax(" 30.00")BigDecimal折扣;

  2. @decimalmin --->样本:@decimalmin(" 5.00")BigDecimal折扣;

  3. @digits --->样本:@digits(integer = 6,分数= 2)BigDecimal价格;

注意:您只能将@max用于 Integer value。

最新更新