Produire un code d’erreur HTTP dans un service REST Spring Boot

Objectif

L’écosystème Java utilise le concept d’Exception pour gérer les erreurs.

Les services REST se basent sur les codes de retours HTTP pour indiquer par exemple une erreur dans la requête (codes 4xx) ou dans son traitement (codes 5xx).

La production d’un code HTTP précis est impératif à la mise en oeuvre d’une API REST de qualité.

L’objectif de cette page est de rappeler comment produire un code d’erreur HTTP dans un contexte Spring Boot. 3 solutions sont proposées. Seule la première est à utiliser pour les projets SEDOO. Les autres solutions sont données à titre informatif pour les applications anciennes.

Solution 1 – Utilisation de ResponseStatusException

ResponseStatusException permet de formuler un code de retour de manière concise:

throw new ResponseStatusException(HttpStatus.NOT_FOUND, "This artifact doesn't exist");

Côté client, le message d’erreur peut être récupéré via la variable: error.response.data.message

Attention: dans les versions récentes de Spring, il faut activer la clé suivante dans le fichier application.yml:

server.error.include-message: always

Solution 2 – Ecriture sur la HttpServletResponse

Si la méthode à accès à la réponse, alors la production de code HTTP peut être effectuée simplement de la manière suivante:

response.sendError(HttpStatus.BAD_REQUEST.value(), "custom error message");

Cette méthode ne doit être utilisé que dans la couche de service où la réponse est disponible. Pour les autres couches, il faut passer par les RuntimeException.

Solution 3 – Utilisation des RuntimeException

Spring Boot intercepte les RuntimeException pour produire des codes d’erreur. Par défaut, une RuntimeException est convertie en code 500.

Pour créer un code particulier, la meilleurse solution est de créer une sous-classe de RuntimeException et d’utiliser l’annotation @ResponseStatus :

@ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE)
public class MyException extends RuntimeException {

	public MyException(String message) {
		super(message);
	}
}

Dans le flux JSON retourné par Spring Boot, status indiquera la valeur du code HTTP, exception contiendra le nom de la classe et message reprendra le message de l’exception.

Si le message d’erreur doit toujours être le même, il est possible de le fixer via l’attribut reason de l’annotation @ResponseStatus.

Gestion de l’erreur côté client

L’exception doit être correctement gérée côté client. Pour ce faire, il convient d’appliquer la préconisation indiqué dans cet article: // A compléter

Crédits photo

unsplash-logoRomson Preechawit

Rechercher