@ Wd Ly предложение, которое я поддержал
Написание рекомендаций для контроллеров Разработчики опробовали множество способов заставить класс рекомендаций для контроллеров работать.После тяжелой работы они нашли следующие моменты, которые следует учитывать:
Создайте свои собственные классы исключений.Несмотря на то, что Spring предоставляет много классов, которые представляют общие исключения в приложении , лучше написать свои собственные или расширить существующие.Один совет по контроллеру для каждого приложения. Рекомендуется иметь все обработчики исключений в одном классе, вместо того, чтобы аннотировать несколько с помощью @ ControllerAdvice .Напишите метод handleException .Этот предназначен для аннотирования @ ExceptionHandler и будет обрабатывать все объявленные в нем исключения, а затем делегировать определенному методу-обработчику.Добавьте один обработчик метода на исключение.Представьте, что вы хотите обработать UserNotFoundException , а затем создать handleUserNotFoundException .Создайте метод, который отправляет ответ пользователю.Методы-обработчики предназначены для выполнения логики для обработки данного исключения, затем они будут вызывать метод, отправляющий ответ.Этот метод получит список ошибок в виде тела и конкретного HTTP-статуса.
@ControllerAdvice
public class GlobalExceptionHandler {
/** Provides handling for exceptions throughout this service. */
@ExceptionHandler({ UserNotFoundException.class, ContentNotAllowedException.class })
public final ResponseEntity<ApiError> handleException(Exception ex, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
if (ex instanceof UserNotFoundException) {
HttpStatus status = HttpStatus.NOT_FOUND;
UserNotFoundException unfe = (UserNotFoundException) ex;
return handleUserNotFoundException(unfe, headers, status, request);
} else if (ex instanceof ContentNotAllowedException) {
HttpStatus status = HttpStatus.BAD_REQUEST;
ContentNotAllowedException cnae = (ContentNotAllowedException) ex;
return handleContentNotAllowedException(cnae, headers, status, request);
} else {
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
return handleExceptionInternal(ex, null, headers, status, request);
}
}
/** Customize the response for UserNotFoundException. */
protected ResponseEntity<ApiError> handleUserNotFoundException(UserNotFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
List<String> errors = Collections.singletonList(ex.getMessage());
return handleExceptionInternal(ex, new ApiError(errors), headers, status, request);
}
/** Customize the response for ContentNotAllowedException. */
protected ResponseEntity<ApiError> handleContentNotAllowedException(ContentNotAllowedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
List<String> errorMessages = ex.getErrors()
.stream()
.map(contentError -> contentError.getObjectName() + " " + contentError.getDefaultMessage())
.collect(Collectors.toList());
return handleExceptionInternal(ex, new ApiError(errorMessages), headers, status, request);
}
/** A single place to customize the response body of all Exception types. */
protected ResponseEntity<ApiError> handleExceptionInternal(Exception ex, ApiError body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}
return new ResponseEntity<>(body, headers, status);
}
}