2014-10-20 10 views
15

Ich habe eine Frage in Bezug auf die konsumiert und produziert einen Teil der @RequestMapping. Ich habe einen Endpunkt, der sowohl JSON als auch XML akzeptiert und JSON zurückgibt, wenn JSON übergeben wird, und XML zurückgibt, wenn XML übergeben wird. Gibt es etwas Spezielles, das ich tun muss, damit dies funktioniert?Frühling 3.1 oder später @RequestMapping Verbraucht/Produziert

Beispielcode ist unten aufgeführt.

@RequestMapping(value = "/something", method = PUT, 
       consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE}, 
       produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE}) 
public SomeObject updateSomeObject(SomeObject acct) { 
    return doStuff(acct); 
} 

Wird diese Arbeit so, wie ich erwarte oder brauche ich zwei Endpunkte updateSomeObjectXML und updateSomeObjectJson beide Fälle zu behandeln?

Danke, Mike

Antwort

20

Der Artikel aus dem Frühjahr-Blog - Content Negotiation using Spring MVC - bieten Informationen darüber, wie Content-Negotiation arbeitet mit Spring MVC, kurz gesagt, wenn Sie den gleichen Endpunkt wollen aus dem Artikel zu handhaben XML und JSON, Ihre Zuordnung korrekt ist, zusammenfassen:

  1. verwenden Pfaderweiterung - Sie können eine json zu /something.json und xml /something.xml und erwarten auf dem Weg, um die gleiche Sache zurückschicken

  2. verwenden Sie die Accept Header, einen Wert von application/json oderverwendenund geben Sie Content-Type an, um den übermittelten Medientyp anzugeben.

1

Nun,

Verbraucht/nimmt String[] als Parameter erzeugt (siehe RequestMapping von Spring Dokumentation), damit ich glaube, dass es funktionieren wird. Sie können auch versuchen, headers = "content-type=application/json,application/xml".

+0

Ya. Meine Frage ist, woher weißt du, welche der "produzierten" es zu einem bestimmten Zeitpunkt produzieren wird. Ist das konfigurierbar oder ist es automatisch? Und wie wählt es automatisch aus? Wenn ich es als Consumer für JSON, XML und Nur-Text aufgelistet habe, aber als Produzent von JSON und XML, welchen Typ gibt es zurück, wenn reiner Text eingeht? –

+0

wird es wahrscheinlich überprüfen, was "akzeptiert" Header wurde eingestellt, um Anfrage und dann Json/XML Serializer von Classpath. – freakman

10

Kurze Antwort:
Anmerken das Verfahren mit @ResponseBody, und der Methodenparameter mit @RequestBody, und es wird funktionieren (keine Notwendigkeit für zwei Methoden).

Erklärung:
Zuerst produziert und verbraucht Attribute narrow the mapping types verwendet werden. Standardmäßig wird der erste gefundene HttpMessageConverter verwendet, der dem angeforderten Medientyp entspricht.

Zweitens fordert Client einen Medientyp durch den Medientyp zu geben:
- Anfrage Accept-Header
- URL sufix (http: //....//some .xml => "application/xml" Medientyp angefordert)
- URL format Parameter (.../einige?format = xls)

Drittens produziert in Kombination mit @ResponseBody wird das Objekt in der gewünschten Medientyp (schön für GET-Anfragen erzeugen, wenn Sie etwas zurück an den Client) und Verbraucht senden müssen in Kombination mit @RequestBody wird das Objekt mit dem angeforderten Medientyp konsumieren (nett für POST-Anfragen, wenn Sie etwas vom Client bekommen müssen).

Vier, Wenn @ResponseBody nicht verwendet wird, werden die HttpMessageConverter nicht verwendet. Eher ViewResolvers treten in und erzeugen eine Ansicht (HTML, PDF ...), und der Rückgabetyp sollte den Regeln folgen, die ViewResolvers begleiten (überprüfen Sie Standardansichtsauflöser und InternalResourceViewResolver für mehr).

Hoffe es hilft.

Weitere Quellen:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#consumes-- http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc