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 :).