Spring-Boot-Controller-Inhaltsverhandlung

7

Ich habe einen einfachen REST-Controller in einer Spring-Boot-Anwendung geschrieben, aber ich bin mir nicht sicher, wie ich die Inhaltsverhandlung implementieren soll, um JSON oder XML basierend auf dem Content-Type-Parameter im Anfrage-Header zurückzugeben. Könnte mir jemand erklären, was mache ich falsch?

Controller-Methode:

%Vor%

Beim Aufruf dieser Methode erhalte ich immer JSON (auch wenn ich Content-Type als application/xml oder text/xml vorschlage).

Wenn ich zwei Methoden mit jeweils unterschiedlichen Mappings und unterschiedlichen Inhaltstypen implementiere, kann ich XML aus der XML-Datei beziehen, funktioniert aber nicht, wenn ich zwei MediaTypes in einer einzigen Methode (wie im Beispiel) angeben.

Ich möchte den Endpunkt \message aufrufen und

empfangen
  • XML, wenn der Content-Type der GET-Anfrage auf application / xml
  • gesetzt ist
  • JSON, wenn der Inhaltstyp die Anwendung / json
  • ist

Jede Hilfe ist willkommen.

BEARBEITEN: Ich habe meinen Controller aktualisiert, um alle Medientypen zu akzeptieren

%Vor%     
Smajl 08.10.2015, 07:59
quelle

2 Antworten

11

Sie finden einige Hinweise im Blog-Beitrag @ RequestMapping mit Produziert und Verbraucht zu Punkt 6.

Beachten Sie den Abschnitt über Content-Type und Accept-Header:

  

@RequestMapping mit Produzieren und Verbrauchen: Wir können Header verwenden   Content-Type und Accept um den Inhalt der Anfrage herauszufinden und was ist das?   Mime-Nachricht will es als Antwort. Zur besseren Übersicht, @RequestMapping   liefert produziert und konsumiert Variablen, wo wir die angeben können   Anfrage content-type für welche Methode aufgerufen wird und die Antwort   Inhaltstyp. Zum Beispiel:

%Vor%      

Die obige Methode kann Nachrichten nur mit Content-Type als text / html konsumieren   und kann Nachrichten vom Typ application / json und   Anwendung / xml.

Sie können auch diesen anderen Ansatz (mit ResponseEntity-Objekt) ausprobieren ermöglicht es Ihnen, den eingehenden Nachrichtentyp zu ermitteln und die entsprechende Nachricht zu erstellen (auch die @ResponseBody-Annotation zu löschen)

    
abarisone 08.10.2015, 08:05
quelle
17

Sie können ContentNegotiationConfigurer

Zuerst sollten Sie die Methode configureContentNegotiation in Ihrer Konfigurationsklasse überschreiben:

%Vor%

favorParameter(true) - Aktivieren von Pfadausdrücken über Parameter- oder Accept-Header.

defaultContentType(MediaType.APPLICATION_JSON) - Legt den Standardinhaltstyp fest. Das heißt, wenn Sie keinen Pfadausdruck übergeben, generiert Spring JSON als Antwort.

mediaType("xml", MediaType.APPLICATION_XML) - legt den Pfadausdruckschlüssel für XML fest.

Wenn Sie Ihren Controller jetzt wie folgt deklarieren:

%Vor%

und nennen es so etwas wie localhost:8080/app/accounts.json , dann wird Spring JSON als Antwort erzeugen. Wenn Sie also localhost:8080/app/accounts.xml aufrufen, erhalten Sie eine XML-Antwort

Weitere Informationen zu diesem finden Sie hier .

    
Artur Boruński 08.10.2015 08:31
quelle

Tags und Links