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?
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. –