Restituzione dei codici di stato personalizzati dai controller Spring

1. Panoramica

Questo rapido articolo illustrerà alcuni modi per restituire codici di stato HTTP personalizzati dai controller Spring MVC .

Questo è spesso importante per esprimere più chiaramente il risultato di una richiesta a un client e utilizzare la semantica ricca e completa del protocollo HTTP. Ad esempio, se qualcosa va storto con una richiesta, l'invio di un codice di errore specifico per ogni tipo di possibile problema consentirebbe al client di visualizzare un messaggio di errore appropriato all'utente.

La configurazione di un progetto Spring MVC di base non rientra nell'ambito di questo articolo, ma puoi trovare ulteriori informazioni qui.

2. Restituzione dei codici di stato personalizzati

Spring fornisce alcuni modi principali per restituire codici di stato personalizzati dalle sue classi Controller :

  • utilizzando un ResponseEntity
  • utilizzando l' annotazione @ResponseStatus sulle classi di eccezione e
  • utilizzando le annotazioni @ControllerAdvice e @ExceptionHandler .

Queste opzioni non si escludono a vicenda; tutt'altro, possono effettivamente completarsi a vicenda.

Questo articolo tratterà i primi due modi ( ResponseEntity e @ResponseStatus ). Se desideri saperne di più sull'utilizzo di @ControllerAdvice e @ExceptionHandler , puoi leggere qui.

2.1. Restituzione dei codici di stato tramite ResponseEntity

In un controller Spring MVC standard, definiremo una semplice mappatura:

@RequestMapping(value = "/controller", method = RequestMethod.GET) @ResponseBody public ResponseEntity sendViaResponseEntity() { return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE); }

Dopo aver ricevuto una richiesta GET a " / controller ", Spring restituirà una risposta con il codice 406 (non accettabile). Abbiamo scelto arbitrariamente il codice di risposta specifico per questo esempio. Puoi restituire qualsiasi codice di stato HTTP (l'elenco completo è disponibile qui).

2.2. Restituzione dei codici di stato tramite un'eccezione

Aggiungeremo un secondo metodo al controller per dimostrare come utilizzare un'eccezione per restituire un codice di stato:

@RequestMapping(value = "/exception", method = RequestMethod.GET) @ResponseBody public ResponseEntity sendViaException() { throw new ForbiddenException(); }

Dopo aver ricevuto una richiesta GET per " / exception ", Spring genererà un'eccezione ForbiddenException . Questa è un'eccezione personalizzata che definiremo in una classe separata:

@ResponseStatus(HttpStatus.FORBIDDEN) public class ForbiddenException extends RuntimeException {}

Nessun codice è richiesto in questa eccezione. Tutto il lavoro viene svolto dall'annotazione @ResponseStatus .

In questo caso, quando viene generata l'eccezione, il controller che l'ha lanciata restituisce una risposta con il codice di risposta 403 (Forbidden). Se necessario, puoi anche aggiungere un messaggio nell'annotazione che verrà restituito insieme alla risposta.

In questo caso, la classe sarebbe simile a questa:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message") public class ForbiddenException extends RuntimeException {}

È importante notare che sebbene sia tecnicamente possibile fare in modo che un'eccezione restituisca un codice di stato, nella maggior parte dei casi ha senso solo logico utilizzare eccezioni per i codici di errore (4XX e 5XX).

3. Conclusione

Il tutorial ha mostrato come restituire codici di stato personalizzati dai controller Spring MVC.

L'implementazione può essere trovata nel progetto GitHub di esempio.