Die HttpMediaTypeNotAcceptableException in Spring MVC

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.