De HttpMediaTypeNotAcceptableException in Spring MVC

1. Overzicht

In dit korte artikel zullen we de HttpMediaTypeNotAcceptableException uitzondering, en begrijp de gevallen waarin we het kunnen tegenkomen.

2. Het probleem

Bij het implementeren van een API-eindpunt met Spring, moeten we over het algemeen de verbruikte / geproduceerde mediatypen specificeren (via de verbruikt en produceert parameters). Dit beperkt de mogelijke indelingen die de API voor die specifieke bewerking naar de client retourneert.

HTTP heeft ook de dedicated "Aanvaarden" header - die wordt gebruikt om mediatypen te specificeren die de client herkent en kan accepteren. Simpel gezegd, de server stuurt een resource-representatie terug met behulp van een van de mediatypen die de client heeft aangevraagd.

Als er echter geen gemeenschappelijk type is waarmee beide zijden kunnen werken, zal Spring de HttpMediaTypeNotAcceptableException uitzondering.

3. Praktisch voorbeeld

Laten we een eenvoudig voorbeeld maken om dit scenario te demonstreren.

We gaan een POST-eindpunt gebruiken - waarmee alleen kan worden gewerkt "toepassing/jsonβ€œ en retourneert ook JSON-gegevens terug:

@PostMapping (waarde = "/ test", verbruikt = MediaType.APPLICATION_JSON_VALUE, produceert = MediaType.APPLICATION_JSON_VALUE) openbaar kaartvoorbeeld () {retourneer Collections.singletonMap ("key", "value"); }

Laten we vervolgens een verzoek verzenden met CURL met een niet-herkend inhoudstype:

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> Accepteer: applicatie / pdf

Het antwoord dat we kregen is:

<HTTP / 1.1 406 <Inhoudslengte: 0

4. De oplossing

Er is maar één manier om het probleem op te lossen - door een van de ondersteunde typen te verzenden / ontvangen.

Het enige wat we kunnen doen is een meer beschrijvend bericht geven (standaard retourneert Spring een lege tekst) met een aangepast bericht ExceptionHandler een klant informeren over alle acceptabele mediatypen.

In ons geval is het alleen "Application / json":

@ResponseBody @ExceptionHandler (HttpMediaTypeNotAcceptableException.class) openbare String handleHttpMediaTypeNotAcceptableException () {retourneer "acceptabel MIME-type:" + MediaType.APPLICATION_JSON_VALUE; }

5. Conclusie

In deze zelfstudie hebben we de HttpMediaTypeNotAcceptableException uitzondering gegenereerd door Spring MVC wanneer er een discrepantie is tussen wat de client vraagt ​​en wat de server daadwerkelijk kan produceren.

Zoals altijd zijn de codefragmenten die in het artikel worden genoemd, te vinden in onze GitHub-repository.