HttpMediaTypeNotAcceptableException: Konnte keine akzeptable Darstellung in Exceptionhandler finden

8

Ich habe die folgende Bilddownload-Methode in meinem Controller (Spring 4.1):

%Vor%

Die folgende ControllerAdvice -Methode sollte eine nicht existierende Datei behandeln und eine json-Fehlerantwort zurückgeben:

%Vor%

Mein JUnit-Test funktioniert einwandfrei

( BEARBEITEN Dies liegt an der Erweiterung .bla: Dies funktioniert auch auf dem Anwendungsserver):

%Vor%

und gibt die folgende Ausgabe:

%Vor%

Allerdings bekomme ich auf meinem Appserver folgende Fehlermeldung, wenn ich versuche, ein nicht vorhandenes Image herunterzuladen:

( BEARBEITEN Dies liegt an der Erweiterung .jpg: Dies schlägt auch beim JUnit-Test mit Erweiterung .jpg fehl):

ERROR org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: public java.util.Map<java.lang.String, java.lang.String> nl.krocket.ocr.web.controller.ExceptionController.handleResourceNotFoundException(nl.krocket.ocr.web.backing.ResourceNotFoundException) org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Ich habe messageconverter in meiner mvc-Konfiguration wie folgt konfiguriert:

%Vor%

Was fehlt mir? Und warum funktioniert der JUnit-Test?

    
s.ijpma 02.09.2015, 10:49
quelle

2 Antworten

18

Sie müssen entscheiden, wie der Medientyp der Antwort von Spring bestimmt werden soll. Das kann auf verschiedene Arten geschehen:

  • Pfaderweiterung (zB. /image.jpg)
  • URL-Parameter (z. B. format = jpg)
  • HTTP-Accept-Header (z. B. Akzeptieren: image / jpg)

Spring betrachtet standardmäßig die Erweiterung und nicht den Header Accept . Dieses Verhalten kann geändert werden, wenn Sie eine @Configuration -Klasse implementieren, die WebMvcConfigurerAdapter erweitert. Dort können Sie configureContentNegotiation(ContentNegotiationConfigurer configurer) überschreiben und den Konfigurator nach Ihren Bedürfnissen konfigurieren, z. durch Aufruf von

%Vor%

Wenn Sie beide auf false setzen, sucht Spring den Header Accept . Da Ihr Client Accept: image/*,application/json sagen und beide behandeln kann, sollte Spring in der Lage sein, entweder das Bild oder den Fehler JSON zurückzugeben.

Siehe dieses Frühjahrs-Tutorial zur Inhaltsverhandlung für weitere Informationen und Beispiele.

    
Adam Michalik 03.09.2015, 09:40
quelle
1

Achten Sie auf Ihren HTTP-Accept-Header. Wenn Ihr Controller beispielsweise "application / octet-stream" (als Antwort) erzeugt, sollte Ihr Accept-Header NICHT "application / json" (in der Anfrage) lauten:

%Vor%     
naXa 08.06.2017 17:46
quelle

Tags und Links