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

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

1. introduction

Dans Spring MVC, nous avons de nombreuses façons deset the status code of an HTTP response.

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

2. Méthodes sur le contrôleur

Lorsqu'un noeud final est renvoyé avec succès, Spring fournit une réponse HTTP 200 (OK).

Si nous voulons spécifier leresponse status of a controller method, nous pouvons marquer cette méthode avec@ResponseStatus. Il a deux arguments interchangeables pour l'état de réponse souhaité:code, etvalue. Par exemple, nous pouvons indicate that the server refuses to brew coffee because it is a teapot:

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

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

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

Notez que lorsque nous définissonsreason, Spring appelleHttpServletResponse.sendError(). Par conséquent, il enverra unHTML error page to the client, which makes it a bad fit for REST endpoints.

Notez également que Spring n'utilise que@ResponseStatus, lorsquethe marked method completes successfully (sans lancer unException).

3. Avec des gestionnaires d'erreur

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

  • en utilisant@ExceptionHandler

  • en utilisant@ControllerAdvice

  • marquage de la classeException

Pour 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 dansthis article.

Nous pouvons utiliser@ResponseStatus avec ces méthodes de gestion d'erreurthe same way we did with regular MVC methods 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 attrape ceException, il utilise les paramètres que nous avons fournis dans@ResponseStatus.

Notez que lorsque nous marquons une classeException avec@ResponseStatus, Spring appelle toujoursHttpServletResponse.sendError(), que nous définissionsreason 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 disponiblesover on GitHub.