2015-12-19 2 views
6

я имел следующий совет контроллер настроен, чтобы вернуть контракт APIs для условий ошибки:Spring Загрузочный @ControllerAdvice обработчик исключений не стреляя

@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] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler 
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler 

Edit:

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

ответ

1

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

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

.exceptionHandling() 

и настроить FailureHandler, если проходит AbstractAuthenticationProcessingFilter в фильтре.

setAuthenticationFailureHandler() 

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

+0

Я пробовал это, но не последовал за ним. Закончился с использованием подхода в моем ответе. Не уверен, что он хороший. –

Смежные вопросы