Die HttpMediaTypeNotAcceptableException in Spring MVC

1. Übersicht

In diesem kurzen Artikel werfen wir einen Blick auf die Ausnahme HttpMediaTypeNotAcceptableException und verstehen die Fälle, in denen sie auftreten können.

2. Das Problem

Bei der Implementierung eines API-Endpunkts mit Spring müssen im Allgemeinen die verbrauchten / produzierten Medientypen angegeben werden (über die Parameter verbraucht und produziert ). Dadurch werden die möglichen Formate eingegrenzt, die die API für diesen bestimmten Vorgang an den Client zurückgibt.

HTTP verfügt außerdem über den dedizierten Header "Accept" , mit dem Medientypen angegeben werden, die der Client erkennt und akzeptieren kann. Einfach ausgedrückt, der Server sendet eine Ressourcendarstellung unter Verwendung eines der vom Client angeforderten Medientypen zurück.

Wenn es jedoch keinen gemeinsamen Typ gibt, mit dem beide Seiten arbeiten können, löst Spring die Ausnahme HttpMediaTypeNotAcceptableException aus .

3. Praktisches Beispiel

Lassen Sie uns ein einfaches Beispiel erstellen, das dieses Szenario demonstriert.

Wir werden einen POST-Endpunkt verwenden, der nur mit „application / json funktioniert und auch JSON-Daten zurückgibt:

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

Senden wir dann eine Anfrage mit CURL mit einem nicht erkannten Inhaltstyp:

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

Die Antwort ist:

< HTTP/1.1 406 < Content-Length: 0

4. Die Lösung

Es gibt nur einen Weg, um das Problem zu beheben - einen der unterstützten Typen zu senden / empfangen.

Wir können lediglich eine aussagekräftigere Nachricht (standardmäßig gibt Spring einen leeren Text zurück) mit einem benutzerdefinierten ExceptionHandler bereitstellen, der einen Client über alle zulässigen Medientypen benachrichtigt.

In unserem Fall ist es nur "application / json" :

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

5. Schlussfolgerung

In diesem Lernprogramm haben wir die von Spring MVC ausgelöste HttpMediaTypeNotAcceptableException- Ausnahme berücksichtigt, wenn zwischen dem, was der Client verlangt, und dem, was der Server tatsächlich produzieren kann, eine Nichtübereinstimmung besteht .

Wie immer finden Sie die im Artikel erwähnten Codefragmente in unserem GitHub-Repository.