Die HttpMediaTypeNotAcceptableException in Spring MVC
1. Überblick
In diesem kurzen Artikel werden wir uns die Ausnahme vonHttpMediaTypeNotAcceptableExceptionansehen und die Fälle verstehen, 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 Parameterconsumes undproduces). Dies schränkt die möglichen Formate ein, die die API für diesen bestimmten Vorgang an den Client zurückgibt.
HTTP hat auch den dedizierten“Accept”-Header, 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 AusnahmeHttpMediaTypeNotAcceptableExceptionaus.
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 _ "_ arbeiten kann 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 Sie dann eine Anfrage mit CURL mit einem nicht erkannten Inhaltstyp:
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
Die Antwort lautet:
< HTTP/1.1 406
< Content-Length: 0
4. Die Lösung
Es gibt nur eine Möglichkeit, das Problem zu beheben: einen der unterstützten Typen zu senden / empfangen.
Alles, was wir tun können, ist, eine aussagekräftigere Nachricht (standardmäßig gibt Spring einen leeren Text zurück) mit einem benutzerdefiniertenExceptionHandler bereitzustellen, das einen Client über alle akzeptablen Medientypen benachrichtigt.
In unserem Fall sind es nur“application/json”:
@ResponseBody
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public String handleHttpMediaTypeNotAcceptableException() {
return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
}
5. Fazit
In diesem Lernprogramm haben wir die von Spring MVC ausgelösteHttpMediaTypeNotAcceptableException-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 sind die im Artikel erwähnten Codefragmente inour GitHub repository zu finden.