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 будет перезаписан, если вы развернете приложение под сервером приложений.

Intereting Posts
Значение параметра Proto3, равное по умолчанию, не распознается во время выполнения Невозможно включить предупреждение «тип платформы объявлений» Kotlin в сообщение об ошибке Почему у kotlin есть функции componentN в классе данных, если у них уже есть геттеры и сеттеры? Широковещательный приемник onReceive () не вызывается KotterKnife – не может использовать bindView (R.id.example_id) для некоторых классов Библиотека Glide java.lang.NoClassDefFoundError OkHttp CookieJar не может добавить cookie для запроса В TornadoFX, как я могу отделить макеты к различным классам, а затем использовать их в построителе? Загрузите GIF с использованием слайд-версии 4.2.0 в Котлин Метод выполнения объекта kotlin Как удалить дубликаты объектов с помощью clearBy из списка в Kotlin? Выполнение не выполнено для задачи ': calculator: compileKonanKotlinArithmeticParserIphone' Может ли перегрузка операторов сравнения в Kotlin использоваться для реализации SQL-подобных функций? Какой тип языка Котлин? Чистый ООП или функциональный В Kotlin, как я могу обойти конфликты наследуемых объявлений, когда класс enum реализует интерфейс?