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.

Solution 1 – 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 2 – 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.

Il est également possible de lancer une exception de type ResponseStatusException:

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

Crédits photo

unsplash-logoRomson Preechawit