Utilizzo di Spring @ResponseStatus per impostare il codice di stato HTTP

1. Introduzione

In Spring MVC, abbiamo molti modi per impostare il codice di stato di una risposta HTTP .

In questo breve tutorial, vedremo il modo più semplice: utilizzare l' annotazione @ResponseStatus .

2. Metodi controller

Quando un endpoint viene restituito correttamente, Spring fornisce una risposta HTTP 200 (OK).

Se vogliamo specificare lo stato della risposta di un metodo del controller , possiamo contrassegnare quel metodo con @ResponseStatus. Ha due argomenti intercambiabili per lo stato della risposta desiderato: codice e valore. Ad esempio, possiamo indicare che il server si rifiuta di preparare il caffè perché è una teiera:

@ResponseStatus(HttpStatus.I_AM_A_TEAPOT) void teaPot() {}

Quando vogliamo segnalare un errore, possiamo fornire un messaggio di errore tramite l' argomento motivo :

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}

Nota che quando impostiamo la ragione , Spring chiama HttpServletResponse.sendError () . Pertanto, invierà una pagina di errore HTML al client, il che lo rende non adatto agli endpoint REST .

Inoltre nota, che la primavera utilizza solo @ResponseStatus , quando il metodo segnato completata correttamente (senza gettare un Exception ).

3. Con gestori di errori

Abbiamo tre modi per utilizzare @ResponseStatus per convertire un eccezione per uno stato di risposta HTTP:

  • utilizzando @ExceptionHandler
  • utilizzando @ControllerAdvice
  • contrassegnare la classe di eccezione

Per poter utilizzare le prime due soluzioni, dobbiamo definire un metodo di gestione degli errori. Puoi leggere di più su questo argomento in questo articolo.

Possiamo usare @ResponseStatus con questi metodi di gestione degli errori nello stesso modo in cui abbiamo fatto con i normali metodi MVC nella sezione precedente.

Quando non abbiamo bisogno di risposte dinamiche all'errore, la soluzione più semplice è la terza: contrassegnare la classe Exception con @ResponseStatus:

@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}

Quando Spring rileva questa eccezione , utilizza le impostazioni fornite in @ResponseStatus .

Nota che quando contrassegniamo una classe Exception con @ResponseStatus , Spring chiama sempre HttpServletResponse.sendError () , indipendentemente dal fatto che impostiamo la ragione o meno.

Si noti inoltre che Spring utilizza la stessa configurazione per le sottoclassi, a meno che non vengano contrassegnate anche con @ResponseStatus .

4. Conclusione

In questo articolo, abbiamo visto come possiamo usare @ResponseStatus per impostare il codice di risposta HTTP in diversi scenari, inclusa la gestione degli errori.

Come al solito, gli esempi sono disponibili su GitHub.