2013-06-26 19 views
28

Ho il REST di primavera impostato correttamente utilizzando Jackson/JSON e tutto funziona.Spring REST utilizzando Jackson - 400 registrazione errata delle richieste

Ma ho introdotto consapevolmente un errore nella struttura del messaggio che ha provocato un 400 - Bad Request. Ma non c'era nessun output di registro sul server. L'errore che mi sarei aspettato sarebbe stato qualcosa come "l'eccezione della proprietà sconosciuta di Jackson" o qualsiasi altra cosa, ma è stata catturata e un errore 400 è stato inviato al client, ma nessun registro dell'eccezione sul server.

Non voglio eseguire il debug di tutto sul server in modo chiaro, ma voglio eccezioni a livello di rete Spring come questa chiaramente etichettate come errori.

Qual è il modo corretto per accenderlo?

Grazie!

risposta

34
@ExceptionHandler 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public void handle(HttpMessageNotReadableException e) { 
    logger.warn("Returning HTTP 400 Bad Request", e); 
} 
+0

Sicuramente v'è un approccio più generale a questo? Immagino che il framework primaverile che genera queste eccezioni abbia una chiamata di registro prima di lanciare l'eccezione. –

+3

Spring li registra a livello DEBUG per quanto posso ricordare. Prendi nota che puoi posizionare questo metodo di gestore di eccezioni in una superclasse. Inoltre, se si desidera restituire messaggi di errore al client (oltre al codice di stato), questa è la strada da percorrere. – Jukka

+1

Un'altra opzione potrebbe essere implementare il proprio ExceptionHandlerResolver per eseguire la registrazione a un livello più "generale". Dai un'occhiata a http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – Jukka

26

Sulla @ risposta di Jukka, è possibile attivare questa globalmente per tutti i controller utilizzando @ControllerAdvice (introdotto nella primavera 3.2). Richiede un piccolo codice da parte tua, ma nella mia esperienza di solito finisci per aver bisogno comunque di una configurazione globale di gestione degli errori e questo ti permette di impostare i breakpoint/ispezionare facilmente i problemi.

Un esempio di questo è al di sotto:

@ControllerAdvice 
public class ControllerConfig { 

    @ExceptionHandler 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public void handle(HttpMessageNotReadableException e) { 
     log.warn("Returning HTTP 400 Bad Request", e); 
     throw e; 
    } 
} 
+6

Molto utile. Ma assicurati di posizionare il tuo ControllerAdvice all'interno di un pacchetto scansionato da Spring: il mio primo tentativo è fallito perché l'ho inserito - essendo un approccio piuttosto generico - in un altro, pacchetto più generale del mio controller e quindi non è stato ascoltato da Spring. – Torgeist

Problemi correlati