Hibernate-validator 6: странное поведение аннотации @Max с установленным BigDecimal в поле Number - PullRequest
0 голосов
/ 01 марта 2019

Я думаю, что мог найти странность в 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, сохраненный в поле Number, не будет вызывать исключение ограничения, даже если онобольше 1. И большой десятичный, такой как 2.xxx.

Такое ощущение, что валидатор больше не учитывает числа после запятой в объектах BigDecimals, хранящихся в Number.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

С помощью Java Bean Validation вы можете использовать три альтернативы для типа BigDecimal:

  1. @ DecimalMax ---> Образец: @DecimalMax ("30.00") BigDecimal discount;

  2. @ DecimalMin ---> Образец: @DecimalMin ("5.00") BigDecimal скидка;

  3. @ Digits ---> Образец: @Digits (целое число = 6, дробь = 2) BigDecimal цена;

Примечание. Вы можете использовать @Max только для значения integer .

0 голосов
/ 01 марта 2019

Хм, вы правы, у нас есть ошибка: когда вы используете Number в качестве объявленного типа, как вы, мы в конечном итоге сравниваем long.Это должно быть легко исправить.

Я видел, как вы заполнили https://hibernate.atlassian.net/browse/HV-1699, мы будем давать вам обновления там.

Я сделаю релиз, как только у нас будет исправлениекак это определенно плохо.

...