Spring Boot @ControllerAdvice обработчик исключений не срабатывает

У меня был настроен следующий советник контроллера, чтобы вернуть контракт API для условий ошибки:

@ControllerAdvice public class ExceptionHandler : ResponseEntityExceptionHandler() { @ExceptionHandler(Throwable::class) @ResponseBody public fun onException(ex: Throwable): ResponseEntity<ErrorResponse> { val errorResponse = ErrorResponse( response = ResponseHeader(ex.responseCode(), ex.message)) return ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED); } } 

Он отлично работал, а затем прекратил работать. Теперь все исключения направляются в BasicErrorController , который возвращает следующий формат:

 { "timestamp" : 1450495303166, "status" : 403, "error" : "Forbidden", "message" : "Access Denied", "path" : "/profile/candidates" } 

Вышесказанное – хорошая уместная отправная точка, но теперь она не уйдет с пути.

  • Я попытался заменить обработчики ошибок одним экземпляром ExceptionHandlerExceptionResolver но это не сработало.
  • Я попытался сделать свой собственный CustomErrorHandler, но это также не подходит, поскольку исходное исключение больше не находится в HttpServletRequest к моменту его повторного маршрута к настраиваемому контроллеру ошибок. Эта информация необходима для того, чтобы вернуть соответствующий ответ клиенту.

Как я:

  • Сделайте SpringBoot не форматированными исключениями для контроллера исключения.
  • Восстановите обработчики исключений @ControllerAdvice, чтобы я мог просто вернуть соответствующий орган ответа и код состояния.

На стартовых весенних журналах:

 main] .mmaExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler main] .mmaExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler 

Редактировать:

После прочтения документов Spring Boot я теперь подчёркиваю, что BasicErrorController должен только запускать все исключения, которые не обрабатываются @ControllerAdvice . Кажется, это не происходит. Итак, почему?

У меня также есть фильтр Spring Security, который оценивает учетные данные заголовка API-ключа и Access-Token. @ControllerAdvice здесь не работает – достаточно справедливо, учитывая, что мы не имеем дело с конечной точкой контроллера!

Используйте EntryPoint и AcessDeniedHandler для обработки исключений из фильтров безопасности. Их можно настроить внутри:

 .exceptionHandling() 

И настройте FailureHandler, если вы расширите AbstractAuthenticationProcessingFilter в своем фильтре.

  setAuthenticationFailureHandler() 

Afaik ErrorController будет перезаписан, если вы развернете приложение под сервером приложений.