2015-12-19 19 views
6

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é?

risposta

1

Ho anche un filtro Spring Security che valuta le credenziali dell'intestazione API-Key e Access-Token. @ControllerAdvice non funziona qui - abbastanza giusto, dato che non abbiamo a che fare con un endpoint del controller!

Utilizzare EntryPoint e AcessDeniedHandler per gestire le eccezioni dai filtri di sicurezza. Ci sono può essere configurato all'interno:

.exceptionHandling() 

e configurare FailureHandler se si estende AbstractAuthenticationProcessingFilter nel filtro.

setAuthenticationFailureHandler() 

Afaik ErrorController verrà sovrascritto se si distribuirà l'applicazione sul server delle applicazioni.

+0

Ho provato questo, ma non l'ho seguito. Finito usando l'approccio nella mia risposta. Non sono sicuro che sia buono. –

Problemi correlati