2015-12-19 8 views
6

miałem następujące rada kontroler skonfigurować, aby powrócić umowę API dla warunków błędach:Wiosna Boot @ControllerAdvice obsługi wyjątku nie wypalanie

@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); 
    } 

} 

To był działa dobrze, a potem przestał działać. Teraz wszystkie wyjątki są kierowane do BasicErrorController, który zwraca następujący format:

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

Powyższe jest miły uparty punkt wyjścia, ale teraz nie dostanie z drogi.

  • Próbowałem zastąpić obsługę błędów jednym wystąpieniem ExceptionHandlerExceptionResolver, ale to nie zadziałało.
  • Próbowałem już zrobić własny CustomErrorHandler, ale to też nie było odpowiednie, ponieważ oryginalny wyjątek nie jest już w HttpServletRequest, zanim ponownie przeszedł do niestandardowego kontrolera błędów. Ta informacja jest potrzebna, aby zwrócić odpowiednią odpowiedź do klienta.

Jak I:

  • Producent SpringBoot nie wyjątki forward do kontrolera wyjątków.
  • Funkcja obsługi wyjątków Restore @ControllerAdvice, dzięki której mogę po prostu zwrócić odpowiednią treść i kod statusu.

na starcie dzienników wiosny:

main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler 
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler 

Edit:

Po przeczytaniu docs Wiosna Boot, I w obecnym stanie, że BasicErrorController jest rzekomo tylko na ogień żadnych wyjątków nie obsługiwane przez @ControllerAdvice. Wygląda na to, że tak się nie dzieje. Pytanie brzmi: dlaczego?

Odpowiedz

1

Mam również filtr Spring Security, który ocenia poświadczenia klucza API i tokenu dostępu. @ControllerAdvice nie działa tutaj - wystarczy, biorąc pod uwagę, że nie mamy do czynienia z punktem końcowym kontrolera!

Użyj EntryPoint i AcessDeniedHandler do obsługi wyjątków z filtrów bezpieczeństwa. Są może być skonfigurowany wewnątrz:

.exceptionHandling() 

i skonfigurować FailureHandler jeśli rozciąga AbstractAuthenticationProcessingFilter w filtrze.

setAuthenticationFailureHandler() 

Afaik ErrorController zostanie nadpisany, jeśli wdrożysz aplikację na serwerze aplikacji.

+0

Próbowałem tego, ale nie podążałem. Skończyłem z wykorzystaniem podejścia w mojej odpowiedzi. Nie jestem pewien, czy to jest dobre. –