Retour des codes d'état personnalisés à partir des contrôleurs Spring

1. Vue d'ensemble

Cet article rapide montre quelques façons de renvoyer des codes d'état HTTP personnalisés à partir de contrôleurs Spring MVC .

Ceci est souvent important pour exprimer plus clairement le résultat d'une requête à un client et utiliser la riche sémantique complète du protocole HTTP. Par exemple, si quelque chose ne va pas avec une demande, l'envoi d'un code d'erreur spécifique pour chaque type de problème possible permettrait au client d'afficher un message d'erreur approprié à l'utilisateur.

La configuration d'un projet Spring MVC de base sort du cadre de cet article, mais vous pouvez trouver plus d'informations ici.

2. Retour des codes d'état personnalisés

Spring fournit quelques moyens principaux de renvoyer des codes d'état personnalisés à partir de ses classes Controller :

  • en utilisant un ResponseEntity
  • en utilisant l' annotation @ResponseStatus sur les classes d'exception, et
  • à l'aide des annotations @ControllerAdvice et @ExceptionHandler .

Ces options ne sont pas mutuellement exclusives; loin de là, ils peuvent en fait se compléter.

Cet article couvrira les deux premières méthodes ( ResponseEntity et @ResponseStatus ). Si vous souhaitez en savoir plus sur l'utilisation de @ControllerAdvice et @ExceptionHandler , vous pouvez en savoir plus ici.

2.1. Retour des codes d'état via une ResponseEntity

Dans un contrôleur Spring MVC standard, nous définirons un mappage simple:

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

À la réception d'une demande GET à « / controller », Spring retournera une réponse avec le code 406 (non acceptable). Nous avons choisi arbitrairement le code de réponse spécifique pour cet exemple. Vous pouvez renvoyer n'importe quel code d'état HTTP (la liste complète peut être trouvée ici).

2.2. Renvoi des codes d'état via une exception

Nous ajouterons une deuxième méthode au contrôleur pour montrer comment utiliser une exception pour renvoyer un code d'état:

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

Lors de la réception d'une requête GET à " / exception ", Spring lancera une ForbiddenException . Il s'agit d'une exception personnalisée que nous définirons dans une classe distincte:

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

Aucun code n'est requis dans cette exception. Tout le travail est effectué par l' annotation @ResponseStatus .

Dans ce cas, lorsque l'exception est levée, le contrôleur qui l'a lancée renvoie une réponse avec le code de réponse 403 (Interdit). Si nécessaire, vous pouvez également ajouter un message dans l'annotation qui sera renvoyé avec la réponse.

Dans ce cas, la classe ressemblerait à ceci:

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

Il est important de noter que s'il est techniquement possible de faire renvoyer une exception n'importe quel code d'état, dans la plupart des cas, il est logique d'utiliser des exceptions pour les codes d'erreur (4XX et 5XX).

3. Conclusion

Le didacticiel a montré comment renvoyer des codes d'état personnalisés à partir de contrôleurs Spring MVC.

L'implémentation se trouve dans l'exemple de projet GitHub.