Здравствуйте, futureOrPresent текущую дату валидирует с ошибкой.
Суть проблемы в том что используется datePicker, а этот валидатор учитывает и время текущее. Необходимо учитывать какой компонент используется (datePicker или dateTimePicker) и понимать надо ли проверять текущее время.
Добрый день.
Я подобную тему вот здесь заводил.
Обратите внимание, на советы которые мне дали.
Здесь это где? В вашем посте нет ни ссылки, ни скрина.
Прошу прощения.
ссылка потерялась
видимо тот же самый кейс описан внизу этой задачи
Добрый день,
Я смотрел эту ошибку и тут возникают очень много споров и разногласий. В первую очередь, JPA и UI валидаотры работают по-разному. Есть пост, где другой разработчик столкнулся с этим, FutureOrPresent not working for today... how to set the constraint to DAY or YEAR? - #9 by krivopustov - Support - Jmix, тут JPA с Date и FutureOrPresent не работает, но наши внутренние валидаторы в UI работают.
Однако, я проверял работу JPA Validation на голом спринге и на самом то деле это поведение правильное, что Date падает(в случае JPA и аннотации @FutureOrPresent:
Bean Validation: @FutureOrPresent is broken in specific case · Issue #2144 · jmix-framework/jmix · GitHub (мой последний комментарий) →
UPD:
For@FutureOrPresent
validator this behaviour is OK if dateType isjava.util.Date
:
If create empty Spring Boot application with hibernate validation and add tests for@FutureOrPast
cases, we would see same results asJmix
behaviour:
- java.util.Date
var dateTestDTO = new DateTestDTO();
dateTestDTO.setDate(new Date());
Set<ConstraintViolation<Object>> validate = validator.validate(dateTestDTO);
Assertions.assertEquals(0, validate.size()); // failed with "expected: <0> but was: <1>"
- java.time.LocalDate
var dateTestDTO = new LocalDateTestDTO();
dateTestDTO.setDate(LocalDate.now());
Set<ConstraintViolation<Object>> validate = validator.validate(dateTestDTO);
Assertions.assertEquals(0, validate.size()); // OK
- java.time.LocalDateTime
var dateTestDTO = new LocalDateTimeTestDTO();
dateTestDTO.setDate(LocalDateTime.now());
Set<ConstraintViolation<Object>> validate = validator.validate(dateTestDTO);
Assertions.assertEquals(0, validate.size()); // failed with "expected: <0> but was: <1>"
Ну и вообще с работой @FutureOrPresent работа валидаторов очень стремная, для каждого типа данных он ведет себя по разному в момент коллизии(когда Present), потому советую либо добавлять текущее время и не пользоваться не точными датами, либо в ручную пользоваться, либо использовать ui валидатор, где грубо говоря проверка не по Instant, а именно Date == Date.
На счет ошибки выше, как вы указали, при проверках на FutureORPresent должен быть DatePicker, type=Date