Spring Boot not found exception

0

Cześć,

bardzo często spotykana sytuacja przy wystawianiu endpointów:

@GetMapping(value = "/get_book/{id}")
void endpoint(@PathVariable id){
// sprawdź czy książka o takim id jest w tabeli w bazie danych. Jeżeli nie, NOT_FOUND exception.
}

Jak można najlepiej zrobić takie sprawdzanie na możliwie wysokim poziomie, tj. uwspólnić? Wiadomo, że tego typu endpointów (oczywiście w zależności od konkretnej domeny) może być bardzo dużo.
Zastanawiam się, jak takie coś zrobić?

*Dziedziczenie po jakiejś klasie i wołanie super? Raczej słabo- mamy jakąś sztuczną nadklasę dla różnych, niezwiązanych ze sobą klas....
*Delegat? Też widzę raczej minusy.

Pytanie dotyczy oczywiście Spring'a (SpringBoota).

Jak w takim razie zrealizować to możliwie "najczyściej"?

Myślałem o zastosowaniu aspektów, ale nigdy tego nie robiłem i jedynie teoretycznie widzę, że może by się nadawały. Ale tak jak mówię, nie wiem, bo nigdy nie widziałem ich w akcji i nie wiem czy to nie jest overwork tutaj. Zwłaszcza, że jak powiedziałem kolegom z firmy to usłyszałem: "Nie cuduj, rób normalnie, po ludzku".

Z góry dzięki za odpowiedź!

Wołam @Koziołek

P.S. jestem początkujący w Springu.

1

Jeśli korzystasz ze SpringData to **findByXYZ **moze zwracać Optional<T>.
I wtedy możesz sobie zrobić taką metodę (nawet statyczną).

<T> T gimmeThatObjectOr404 (Optional<T>  object) {
   return object.orElseThrow(() ->new  My404Exception());
}

gdzie My404Exception ma annotacje @ResponseStatus(value=HttpStatus.NOT_FOUND).

Dużo kodu tym nie oszczedzasz, ale zawsze coś.

0

A może nie warto takiego zabezpieczenia w ogóle robić ?

1

Np u nas jak dao nie znajdzie obiektu to rzuca wyjątek ObjectNotFoundException hibernate robi to z automatu i wtedy @ControllerAdvice

0

@jarekr000000:
korzystam z Hibernate'a

0

Dodaj interface dao z metoda get, dodaj annotacje przyjmujaca jako parametr class implementujaca w/w interface oraz parametr z nazwa param wejsciowego po jakim chcesz szukac w metodzie get. Zapnij aspect na dodanej annotacji.
Jak cos niezbyt jasno napisalem to wieczorem podam przyklad.

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