Wpis z mikrobloga

Chce napisac serwer Restowy w oparciu o springboot i hibernate. Mam juz modele encji, repository, service i jestem na etapie robienia controllerow restowych do operacji crudowych.

No i tutaj mam pytanie jak przykładowo dostaje requesta do modyfikacji Usera to jaka jest najlepsza praktyka walidacji? Sprawdzic w rescie przy pomocy UserService czy user istnieje i jezeli tak to na nim dzialac czy puszczac od razu do service userUpdate i tam rzucac wyjatek jezeli query sie nie powiedzie i w controllerze restowym lapac ten wyjatek i dalej go obslugiwac?

Chyba 1 opcja ma wiecej sensu?

#java #spring #hibernate #programowanie
  • 19
@Burkhard: raczej kontroler jest od kierowania ruchem, nie wrzucalbym tam jakiejś logiki która sprawdza czy użytkownik istnieje. Wrzuć to do serwisu, tam sprawdź czy istnieje i stamtąd rzuć wyjątek. Mało tego, zrób oddzielną klasę która pobiera użytkownika np. po id i rzuca wyjątek jak nie istnieje. Wtedy taka klasa update będzie robić tylko jedną rzecz - update.
Wyjątki możesz łapać global exception handlerem. Albo zrób swój wyjątek i dorzuć adnotacje jaki
@Burkhard: Według mnie, opcja numer 2. Nie pamiętam dokładnie, jak wygląda Transakcyjność w springowych rest'ach i piszę w oparciu o SOAPy w EJB - podejrzewam, że podobnie, tak więc metoda w soapie jest poza transakcją i wykonując bardziej skomplikowane czynności (zapis w kilku tabel) to nie jest pożądane, bo w przypadku błędu w drugim kroku, zapisy z pierwszego kroku zostały scommitowane do bazy.

Tak więc, według mnie w rescie nie robimy
Gdybym ja to zrobił w service:
update(id, body) {
User user = repository.findById(id).orElse(new NotFoundException(message));
user.setXYZ(body.getXYZ);
return repository.save(user);
}
@Burkhard: Zaznaczam, że ja się dopiero uczę springa, ale zrobił bym na to osobną klasę UserEventHandler z adnotacją RepositoryEventHandler i w niej umieścił metodę z adnotacją BeforeSaveEvent, w której sprawdzałbym czy user istnieje w repozytorium i jeśli nie to rzucić wyjątkiem, który wychwyciła by klasa z adnotacją ControllerAdvice.
@jpawz: generalnie uważam, że pisanie dodatkowej klasy do czegoś co można zrobić w jednej linijce używając optionala to nie jest dobra praktyka. Co innego gdyby tam była jakaś bardziej skomplikowana logika. Dodatkowo, nie robiłem testów ale podejrzewam, że zrobienie tego za pomocą Eventów będzie mniej wydajne
@bohme: dzięki za wyjaśnienie. Właśnie uczę się spring boota i też miałem taki właśnie problem, przeczytałem o eventach w spring data i sam próbowałem zastosować tę technikę do mojego przypadku. Przeczytałem ten post na stacku i myślałem, że to będzie rozwiązanie, ale faktycznie w serwisie łatwiej to zrobić.
raczej kontroler jest od kierowania ruchem, nie wrzucalbym tam jakiejś logiki która sprawdza czy użytkownik istnieje.


@ajentidzej: @Burkhard: Spring sam do tego zachęca dając nam możliwość pisania logiki do walidacji w osobnych klasach z użyciem @Valid i @InitBinder

Jeśli nie w kontrolerze to po prostu wyrzucałbym wyjątek i obsługiwał przez @ControllerAdvice (co i jak powinno być w projkecie zrobione) jak sugeruje @jpawz

@bLnq: Sprawdzenie czu encja instnieje w kontrolerze
wykonując bardziej skomplikowane czynności (zapis w kilku tabel) to nie jest pożądane, bo w przypadku błędu w drugim kroku, zapisy z pierwszego kroku zostały scommitowane do bazy.


@Koryntiusz: ale ty czytaj co napisałem :D chociażby z tego powodu jest to kiepski pomysł ( ͡° ͜ʖ ͡°)