ho avuto il seguente consiglio di controllo istituito, per restituire un contratto di API per le condizioni di errore:Primavera Boot @ControllerAdvice gestore di eccezioni non sparare
@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);
}
}
E era lavorare bene e poi ha smesso di funzionare. Ora tutte le eccezioni vengono instradati verso BasicErrorController
, che restituisce il seguente formato:
{
"timestamp" : 1450495303166,
"status" : 403,
"error" : "Forbidden",
"message" : "Access Denied",
"path" : "/profile/candidates"
}
Quanto sopra è un bel punto di partenza supponente, ma ora non otterrà fuori strada.
- Ho provato a sostituire i gestori di errori con un'istanza di
ExceptionHandlerExceptionResolver
ma non ha funzionato. - Ho provato a creare il mio CustomErrorHandler, ma anche questo non era adatto poiché l'eccezione originale non è più nello
HttpServletRequest
nel momento in cui si reindirizza al controller degli errori personalizzato. Queste informazioni sono necessarie per restituire una risposta appropriata al cliente.
Come I:
- Marchio SpringBoot non eccezioni in avanti per un controller un'eccezione.
- Ripristina gestori di eccezioni @ControllerAdvice, in modo da poter solo restituire un corpo di risposta e un codice di stato appropriati.
all'avvio tronchi di primavera:
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
Edit:
Dopo aver letto la documentazione Primavera Boot, ho sotto supporto ora che il BasicErrorController si suppone solo al fuoco per eventuali eccezioni non gestito da un @ControllerAdvice
. Questo sembra non accadere. Quindi la domanda è perché?
Ho provato questo, ma non l'ho seguito. Finito usando l'approccio nella mia risposta. Non sono sicuro che sia buono. –