Spring - Obsługa błędów w serwisach i globalne klasy wyjątków.

0

Cześć mam pytanie w jaki sposób najlepiej wyłapywać błędy w serwisach i przekazywać je do kontrolera? W tej chwili robię to tak z użyciem @ResponseStatus (sporo magi, mało kodu). Powiedzmy, że mam taki serwis:

 public void updateUser(User user, UserUpdateRequest payload) {
        if (user == null) {
            throw new ServiceResourceNotFoundException("Cannot update user - get NULL instead of User");
        }
        if (payload.getName() == null) {
            throw new ServiceBadRequestException("Name cannot be null or small than 2 characters");
        }
        user.setName(payload.getName());
        user.setEmail(payload.getEmail());
        userRepository.save(user);
    }

Oraz w com.domain.global.exception :


@ResponseStatus(HttpStatus.NOT_FOUND)
public class ServiceResourceNotFoundException extends RuntimeException {
    public ServiceResourceNotFoundException(String message) {
        super(message);
    }
}

Tworzenie takiej globalnej klasy jest ok? (ServiceResourceNotFoundException, ServiceBadRequestException), czy lepiej robić to per package np. UserResourceNotFoundException, UserBadRequestException?

Czy korzystać z @ResponseStatus, czy robić mniej magi i łapać te wyjątki ręcznie w kontrolerze try catch i response z msg np. ResponseEntity<ApiResponse>? W jaki sposób podchodzicie do tego problemu? Jest też np, @ControllerAdvice. Jaki jest tu Best Practice?

I przy okazji zadam jeszcze jedno pytanie, jak najlepiej organizować pliki w projekcie A, czy B i dlaczego:
A: **
com.domain
....
-> security**
........->model
............->Security
........ ->controller
............->SecurityController
........->service
............->SecurityService
** -> user**
........ ->model
............->User
........->controller
............ ->UserController
........->service
............->UserService
B:
com.domain
....-> services
........-> UserService
........ -> SecurityService
....-> models
........ -> User
........ -> Dog
....-> controllers
........ -> UserController
........ -> DogController
//...

Dzięki wszystkim za pomoc i odpowiedzi :).

1

Jeśli chcesz iść w full metal spring to będzie spoko. Natomiast jeśli chcesz inaczej to znowu zalinkuje swój wpis oraz drugi

Co do plików to wersja A plus często nie będziesz potrzebował podziału na pakiety model, service i controller bo trochę to wtedy bez sensu.

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