Валидация DTO
От: Pavel Dvorkin Россия  
Дата: 07.04.22 02:42
Оценка: 3 (1) -1 :)
Добрый день!

Есть входной DTO примерно такого вида


class Dto {
 private String fromDate;
 private String toDate;
 private String period;
}


Задается начало и конец интервала дней и период выполнения. Например, "daily" — ежедневно, "odd" — по нечетным, "Mon,Sat" — по понедельникам и субботам и т.д.,

На основании этих данных должен быть создан класс модели


class Dates {
 private List<LocalDate> dates;
}


то есть заданные в DTO данные развертываются в список по конкретным дням.

В общем, все просто. Вопрос же вот в чем

DTO надо валидировать, а поскольку все это под Spring, то валидация идет с помощью кастомной аннотации и isValid в классе , обслуживающем ее. И вызывается он не мной, а автоматически при вызове метода контроллера.

Валидация должна обнаружить ошибки самого разного рода. Например, если в итоге получился пустой список — ошибка. Если день недели указан дважды — ошибка. И ряд других.

Чтобы эту валидацию провести, надо фактически выполнить создание списка дат из исходного DTO. По ходу создания и выяснится, есть ошибки или нет.

Но, напоминаю, это лищь валидация DTO. Если DTO признан валидным, то дальше на его основе должен строиться класс модели. То есть фактически выполняться то же самое, но уже без проверок.

Как лучше это организовать, чтобы дважды не делать ?

Пока сделал так. В DTO ввел transient private List<LocalDate> dates; и в isValid его и заполняю, проверяя по ходу действия. После этого при построении класса модели просто беру все данные из этого списка.

Что не нравится — посторонний член класса в DTO.

Еще один вариант — не проводить валидацию всерьез в isValid, оставить лишь простейшие проверки типа @NotEmpty, а основную проверку отложить до момента создания класса модели из DTO. Тут, конечно, 2 раза делаться не будет. Но в этом случае фактически валидация в основном перенесена в метод, который не должен валидацией заниматься.
With best regards
Pavel Dvorkin
Отредактировано 07.04.2022 2:43 Pavel Dvorkin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.