На мой взгляд, лучшее место для обработки исключений - уровень обслуживания. Для меня метод контроллера REST должен, в лучшем случае, обрабатывать запрос и передавать его в сервисный метод.
При таком подходе у вас есть очень четко определенные слои, которые выполняют очень четко определенную работу. Например, ваш сервисный уровень будет обрабатывать проверку запроса, постоянное действие, а также предоставит (при необходимости) объект возврата в контроллер, который затем будет преобразован в соответствующий объект ответа (ResponseEntity
в вашем случае).
Имея это в виду, ничто не мешает вам создавать какие-либо исключения в слое обслуживания и переводить их в правильные ответы. Spring имеет очень аккуратный и мощный механизм, который делает именно то, что называется обработчиком исключений.
Так что в вашем случае для действия по проверке пароля вы можете сделать что-то вроде:
if (!user.getPassword().equals(user.getConfirmPassword())) {
throw new PasswordMismatchException("Passwords are not the same for user:: " + user.getName());
}
Где PasswordMismatchException
- это исключение RuntimeException. Имея что-то подобное, вы можете затем установить ExceptionHandler и соответствующий метод, чтобы перехватить это и преобразовать в ответ. Простым примером будет:
@RestControllerAdvice
public class ApplicationExceptionHandler {
@ExceptionHandler(PasswordMismatchException.class)
public ResponseEntity<String> handleBadPasswords(PasswordMismatchException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
Подробнее об этом вы можете прочитать в документации Spring:
Spring ExceptionHandler
Обработка исключений весной