Где валидировать user input?

189
02 марта 2018, 16:55

Есть CRUD API к Entity. Entity имеет поля id и someString Состоит из трех слоев : Controller, Service, Repository Естественно контроллер знает только о сервисе, а сервис только о репозитории Между клиентом и сервером jakson маршалит Entity(json).

в контроллере есть такие методы

Entity getById(@PathVariable Long id)
Entity create(@RequestBody Entity entity)
void delete(@PathVariable Long id)
Entity update(@PathVariable Long id, @RequestBody Entity entity)

аналогичные методы присутствуют и в сервисе

Используется Spring Data и соответственно JpaRepository. как известно у нее по умолчанию нет метода update. И создание и обновление entity решаетcя с помощью метода save. Соответственно если мы передаем в метод save Entity с установленным ID то происходит обновление оного, в противном случае создается новая запись в БД.

А вопрос состоит вот в чем:

Где нужно валидировать Entity от клиента, залетающая в метод create контроллера, на присутствие id в ней дабы вместо создания записи не произошла правка уже существующей: в сервисе, в контроллере или самой модели.

Где нужно проверять наличие Entity в базе, залетающая в метод update, перед тем как апдейтить запись дабы не создать новую.

Answer 1

Валидируйте в слое сервиса.

Если нет ограничения на количество запросов к базе, то сначала проверьте есть ли сущность с таким id. Если ограничение есть, то кешируйте id, немного сэкономите.

  • Контроллер проводит манипуляции с вьюшками и сущностями, чтобы они подружились.
  • Репозиторий делает тоже самое только с БД и сущностями.
  • Т.е. для логических действий остается слой сервиса
Answer 2

Это всё должно разруливаться на уровне контроллера, принимающего запрос и данные. Поясню, что имею ввиду: если мы хотим создать Entity, то выполняем запрос методом POST, если нам нужно изменить существующую Entity, то выполняем запрос методом PUT.

Валидировать данные нужно во-первх на клиенте (JavaScript), во-вторых на сервере (есть у спринга интерфейс Validator и аннотация @Validated).

В итоге имеем в контроллере такие методы

@RequestMapping(method = RequestMethod.POST)
Entity create(@RequestBody @Validated Entity entity)
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
Entity update(@PathVariable Long id, @RequestBody @Validated Entity entity)
READ ALSO
Ошибка в конструкторе CustomView

Ошибка в конструкторе CustomView

У меня есть CustomView который рисует текст по ширинеНа андроиде 7

208
Объединение двух запросов Retrofit правильная реализация

Объединение двух запросов Retrofit правильная реализация

Добрый день помогите разобраться с запросамиЕсть два JSON

238
Что лучше при поиске чисел Фибоначчи - рекурсия или простое сложение?

Что лучше при поиске чисел Фибоначчи - рекурсия или простое сложение?

С рекурсией решается быстрее, если искать до 21 числа, а вот все что больше уже намного быстрее решается простым сложениемПочему с рекурсией...

202
Как реализовать пункт с подпунктами в Android

Как реализовать пункт с подпунктами в Android

ЗдравствуйтеУ меня есть одна задача и я пока не знаю как ее решить

186