Utilisation de Spring @ResponseStatus pour définir le code d'état HTTP

1. Introduction

Dans Spring MVC, nous avons de nombreuses façons de définir le code d'état d'une réponse HTTP .

Dans ce court didacticiel, nous verrons le moyen le plus simple: utiliser l' annotation @ResponseStatus .

2. Sur les méthodes du contrôleur

Lorsqu'un point de terminaison revient avec succès, Spring fournit une réponse HTTP 200 (OK).

Si nous voulons spécifier l' état de réponse d'une méthode de contrôleur , nous pouvons marquer cette méthode avec @ResponseStatus. Il a deux arguments interchangeables pour l'état de réponse souhaité: code et valeur. Par exemple, nous pouvons indiquer que le serveur refuse de préparer du café car il s'agit d'une théière:

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

Lorsque nous voulons signaler une erreur, nous pouvons fournir un message d'erreur via l' argument raison :

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

Notez que lorsque nous définissons la raison , Spring appelle HttpServletResponse.sendError () . Par conséquent, il enverra une page d'erreur HTML au client, ce qui en fait un mauvais ajustement pour les points de terminaison REST .

Notez également que Spring n'utilise @ResponseStatus que lorsque la méthode marquée se termine avec succès (sans lever d' exception ).

3. Avec les gestionnaires d'erreurs

Nous avons trois façons d'utiliser @ResponseStatus pour convertir une exception en état de réponse HTTP:

  • en utilisant @ExceptionHandler
  • en utilisant @ControllerAdvice
  • marquage de la classe Exception

Afin d'utiliser les deux premières solutions, nous devons définir une méthode de gestion des erreurs. Vous pouvez en savoir plus sur ce sujet dans cet article.

Nous pouvons utiliser @ResponseStatus avec ces méthodes de gestion des erreurs de la même manière que nous l'avons fait avec les méthodes MVC régulières dans la section précédente.

Lorsque nous n'avons pas besoin de réponses d'erreur dynamiques, la solution la plus simple est la troisième: marquer la classe Exception avec @ResponseStatus:

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

Lorsque Spring détecte cette exception , il utilise les paramètres que nous avons fournis dans @ResponseStatus .

Notez que lorsque nous marquons une classe Exception avec @ResponseStatus , Spring appelle toujours HttpServletResponse.sendError () , que nous définissions la raison ou non.

Notez également que Spring utilise la même configuration pour les sous-classes, sauf si nous les marquons également avec @ResponseStatus .

4. Conclusion

Dans cet article, nous avons vu comment nous pouvons utiliser @ResponseStatus pour définir le code de réponse HTTP dans différents scénarios, y compris la gestion des erreurs.

Comme d'habitude, les exemples sont disponibles à l'adresse over sur GitHub.