Walidacja tylko w DTO?

1

Cześć.

Przy zapisywaniu/edytowaniu nowej encji, walidacja powinna odbywać się tylko w requestach DTO, czyli jeszcze przed wejściem w controller i odpaleniu serwisu?

Czy może jeszcze oprócz tego powinna być dodatkowa walidacja w serwisie albo jakoś wymusić bezpośrednio na encji?

Jak to robicie i czego konkretnie do tego używacie?

Poprzez walidacje mam na myśli sprawdzanie wymagań bazy danych: maksymalna długość znaków i sprawdzanie czy nie jest nullem. Ewentualnie sprawdzanie czy nie jest puste, albo specjalne znaki, itd.

4

Walidację przeprowadza się na 3 poziomach:

  1. Formatu - to możesz zrobić wewnątrz DTO lub w walidatorze
  2. Struktury - podobnie
  3. Spójności / reguł biznesowych - to sprawdzasz w warstwie domenowej, ew. na bazie danych

Polecam:

3

Ja najczęściej robiłem tak:

  • Na żądaniu HTTP zapięty filtr który robi techniczną walidacje (puste/niepuste, długość, regex, dodatnia, min, max itp.)
  • Walidacja biznesowa (czy np. zamówienie można anulować) w domenie (czyli może być w serwisie w podejściu warstwowym).
  • Security check czy użytkownik może wykonać daną akcje: rolami na kontrolerze lub jeżeli na danych to na poziomie repo i poszczególnych encji (jak zaleca czcigodny OWASP, choć nie podobało mi się to jako programiście)

Czasami pojawiają się problemy, zwykle gdy odpalał się filtr od walidacji to nie było jeszcze otwartej transakcji bazodanowej. Zwykle nie ma to znaczenia i filtr może mieć swoją transakcje jeżeli chcę wykonać głębszą walidację, ale czasami to przeszkadza.

Gdy pisałem w .NET Core z wykorzystaniem MediatR'a to walidacja było uruchamiana (o ile dobrze pamiętam) jako dekorator na handlarze (IPipelineBehavior). Zaleta jest taka że można wtedy walidator dać po otwarciu transakcji co pewne rzeczy ułatwia (aka spójność, choć READ_COMMITED za wiele nie gwarantuje).

0

Korzystacie z tych wszyskich adnotacji @NotNull, @Valid, @Min, @Max w dtosach czy raczej ręcznie piszecie walidatory? Do ręcznych walidacji dtosów fajnie się sprawdza Vavr i Validation z tego co używałem.

W domenie powtarzacie walidacje? Bo jeśli mamy sobie VO Email i tworzymy go jakąś metodą fabrykującą to zakładam, że tam też poza innymi regułami sprawdzacie też jego nullability nawet jeśli w dto zostało już to sprawdzone? Czy macie jakieś inne patenty na niepowtarzanie walidacji? W Kotlinie możemy nullability wychwycić na etapie formatowania, a w javie zostają jedynie adnotacje jak chcemy najprościej?

0
Bambo napisał(a):

Korzystacie z tych wszyskich adnotacji @NotNull, @Valid, @Min, @Max w dtosach czy raczej ręcznie piszecie walidatory? Do ręcznych walidacji dtosów fajnie się sprawdza Vavr i Validation z tego co używałem.

@NotNull, @Valid, @Min, @Max i hibernate-validation mają tę wadę że hibernate-validation ostro używa refleksji więc jeśli kiedyś będziesz chciał użyć GraalVM to będzie trzeba to wszystko przepisać. Chyba że użyjesz implementacji micronaut-validation która podobno nie ma tego problemu

0

@KamilAdam:
A mam jeszcze pytanie o walidację. W biznesowej logice powtarzasz ją?

Bo w walidacji struktury/formatu sprawdzamy nulle, jakieś max lenghty itd itd, ale w sumie w domenie przy tworzeniu Value Objectów też takie walidacje powinniśmy mieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1