Spring-boot Rest: использовать ControllerAdvice, но оставить обработчики по умолчанию - PullRequest
0 голосов
/ 19 сентября 2019

Моя основная задача заключалась в том, чтобы отлавливать определенные пользователем исключения и возвращать общие ответы.Для этого я использовал @ControllerAdvice с @ExceptionHandler.См. Пример ниже

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler  {

    @ExceptionHandler(PersonNotFoundException.class)
    public void handleBadPostalCode(HttpServletResponse response) throws IOException {
        response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid person Id");
    }

    @ExceptionHandler(Exception.class)
    public void handleDefault(Exception e, HttpServletResponse response) throws IOException {
        e.printStackTrace();
        response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Unknown error happened");
    }
}

PersonNotFoundException обрабатывается, как ожидается.Но обработчики по умолчанию других исключений пропали и возвращается только Http-код без тела.Очевидно, это ожидаемое поведение при расширении ResponseEntityExceptionHandler.Я могу переопределить другие исключения по умолчанию, но это не идеально.Использование универсального обработчика Exception.class заставит меня вернуть один HTTP-код для всех из них.

ТАК Я ищу способ обрабатывать свои собственные исключения глобально в ControllerAdvice или подобном без необходимости переопределения по умолчаниюобработчики исключений

Спасибо

1 Ответ

0 голосов
/ 19 сентября 2019

Самый быстрый и чистый способ справиться с этим - просто использовать @ResponseStatus в вашем классе исключений:

 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")  // 404
 public class OrderNotFoundException extends RuntimeException {
     // ...
 }

Также необходимо расширение ResponseEntityExceptionHandler?ИМО это не так.Вы можете справиться с этим только с помощью @ControllerAdvice (или @RestControllerAdvice) и @ExceptionHandler

Более того, вы можете напрямую вернуть свой ответ в метод, не вводя HttpServletResponse и не вызывая send() метод.Взгляните на это руководство.

...