HttpMediaTypeNotAcceptableException in Spring MVC

1. Panoramica

In questo rapido articolo, daremo un'occhiata all'eccezione HttpMediaTypeNotAcceptableException e capiremo i casi in cui potremmo incontrarla.

2. Il problema

Quando si implementa un endpoint API con Spring, in genere è necessario specificare i tipi di supporti consumati / prodotti (tramite i parametri consumes e produce ). Questo restringe i possibili formati che l'API restituirà al client per quella specifica operazione.

HTTP ha anche l' intestazione "Accept" dedicata , che viene utilizzata per specificare i tipi di media che il client riconosce e può accettare. In poche parole, il server restituirà una rappresentazione della risorsa utilizzando uno dei tipi di supporto richiesti dal client.

Tuttavia, se non esiste un tipo comune con cui entrambe le parti possono lavorare, Spring genererà l' eccezione HttpMediaTypeNotAcceptableException .

3. Esempio pratico

Creiamo un semplice esempio che dimostrerà questo scenario.

Utilizzeremo un endpoint POST, che può funzionare solo con "application / json " e restituisce anche i dati JSON:

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

Quindi, inviamo una richiesta utilizzando CURL con un tipo di contenuto non riconosciuto:

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 risposta che abbiamo ottenuto è:

< HTTP/1.1 406 < Content-Length: 0

4. La soluzione

C'è solo un modo per risolvere il problema: inviare / ricevere uno dei tipi supportati.

Tutto quello che possiamo fare è fornire un messaggio più descrittivo (per impostazione predefinita Spring restituisce un corpo vuoto) con un ExceptionHandler personalizzato che notifica a un client tutti i tipi di media accettabili.

Nel nostro caso, è solo "application / json" :

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

5. conclusione

In questo tutorial, abbiamo considerato l' eccezione HttpMediaTypeNotAcceptableException generata da Spring MVC quando c'è una mancata corrispondenza tra ciò che il client richiede e ciò che il server può effettivamente produrre.

Come sempre, gli snippet di codice menzionati nell'articolo possono essere trovati nel nostro repository GitHub.