Renvoi de codes d’état personnalisés à partir de contrôleurs à ressort

Renvoi de codes d'état personnalisés à partir de contrôleurs de ressort

1. Vue d'ensemble

Cet article rapide vous montrera quelques façons dereturn custom HTTP status codes from Spring MVC controllers.

Ceci est souvent important pour exprimer plus clairement le résultat d'une requête à un client et utiliser la 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'informationshere.

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

Spring propose quelques méthodes principales pour renvoyer des codes d'état personnalisés à partir de ses classesController:

  • en utilisant unResponseEntity

  • en utilisant l'annotation@ResponseStatus sur les classes d'exceptions, et

  • en utilisant les annotations@ControllerAdvice et@ExceptionHandler.

Ces options ne sont pas mutuellement exclusives. loin de là, ils peuvent en réalité 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 surhere.

2.1. Renvoi des codes d'état via unResponseEntity

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 renvoie 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éehere).

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

Nous ajouterons une deuxième méthode au contrôleur pour montrer comment utiliser unException 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 unForbiddenException. Il s'agit d'une exception personnalisée que nous définirons dans une classe séparée:

@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 (Forbidden). Si nécessaire, vous pouvez également ajouter un message dans l'annotation qui sera renvoyée 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 renvoyer n'importe quel code d'état par une exception, il est généralement 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 peut être trouvée dans lesexample GitHub project.