L’exception HttpMediaTypeNotAcceptableException dans Spring MVC

L'exception HttpMediaTypeNotAcceptableException dans Spring MVC

1. Vue d'ensemble

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

2. Le problème

Lors de l'implémentation d'un point de terminaison d'API avec Spring, nous devons généralement spécifier les types de supports consommés / produits (via les paramètresconsumes etproduces). 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 de ressource en utilisant l’un des types de média 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'exceptionHttpMediaTypeNotAcceptableException.

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 des 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 demande à l'aide de CURL avec un type de contenu non reconnu:

curl -X POST --header "Accept: application/pdf" http://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 eue est la suivante:

< HTTP/1.1 406
< Content-Length: 0

4. La solution

Il n’existe 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 retourne un corps vide) avec unExceptionHandler 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 pris en compte l'exceptionHttpMediaTypeNotAcceptableException lancée par Spring MVC en cas d'incohérence 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 dansour GitHub repository.