L'exception HttpMediaTypeNotAcceptableException dans Spring MVC

1. Vue d'ensemble

Dans cet article rapide, nous allons examiner l' exception HttpMediaTypeNotAcceptableException et comprendre les cas où nous pourrions la rencontrer.

2. Le problème

Lors de la mise en œuvre d'un point de terminaison d'API avec Spring, nous devons généralement spécifier les types de médias consommés / produits (via les paramètres consomme et produit ). Cela réduit les formats possibles que l'API renverra au client pour cette opération spécifique.

HTTP a également l'en- tête dédié «Accept» - qui est utilisé pour spécifier les types de média que le client reconnaît et peut accepter. En termes simples, le serveur renverra une représentation des ressources en utilisant l'un des types de supports demandés par le client.

Cependant, s'il n'y a pas de type commun avec lequel les deux côtés peuvent travailler, Spring lèvera l' exception HttpMediaTypeNotAcceptableException .

3. Exemple pratique

Créons un exemple simple qui illustrera ce scénario.

Nous allons utiliser un point de terminaison POST - qui ne peut fonctionner qu'avec «application / json » et renvoie également les données JSON:

@PostMapping( value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public Map example() { return Collections.singletonMap("key", "value"); }

Ensuite, envoyons une requête en utilisant CURL avec un type de contenu non reconnu:

curl -X POST --header "Accept: application/pdf" //localhost:8080/test -v > POST /test HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.51.0 > Accept: application/pdf

La réponse que nous avons obtenue est:

< HTTP/1.1 406 < Content-Length: 0

4. La solution

Il n'y a qu'une seule façon de résoudre le problème: envoyer / recevoir l'un des types pris en charge.

Tout ce que nous pouvons faire est de fournir un message plus descriptif (par défaut, Spring renvoie un corps vide) avec un ExceptionHandler personnalisé notifiant au client tous les types de médias acceptables.

Dans notre cas, il ne s'agit que de «application / json» :

@ResponseBody @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public String handleHttpMediaTypeNotAcceptableException() { return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE; }

5. Conclusion

Dans ce didacticiel, nous avons examiné l' exception HttpMediaTypeNotAcceptableException lancée par Spring MVC en cas de non-concordance entre ce que le client demande et ce que le serveur peut réellement produire.

Comme toujours, les extraits de code mentionnés dans l'article se trouvent dans notre référentiel GitHub.