2016-04-14 10 views
0

Ich bin ziemlich neu in Spring MVC. Heute, wenn ich @ResponseBody lernen, ich habe einige Fragen über HttpMessageConverter s:@ResponseBody, um verschiedene Antwortformat zu wählen

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
     </list> 
    </property> 
</bean> 

Wie oben erwähnt, könnten wir eine Liste mit verschiedenen Konvertern erklären. Es bedeutet also, dass wir einen von ihnen als Response Body Converter auswählen können.

Aber wie wählt man das zu verwenden? Zum Beispiel in functionA(), um JSON und dann in zurückzugeben, um XML zurückzugeben.

Mein Weg ist es, Content-Type der Antwort zu erzwingen, ist es ein richtiger Weg? Oder existiert eine bessere Lösung?

public @ResponseBody User getUser(HttpServletResponse response) { 
    response.setContentType("application/xml");   
    // SOME CODES HERE 
    return user; 
} 

Antwort

1

Aber wie die man wählen zu benutzen? Zum Beispiel in Funktioneine(), um return JSON und dann in FunktionD() zurückzukehren XML

Sie RequestMapping s‘verwenden können produces Attribut für das:

@RequestMapping(value = "/a", produces = "application/json") 
public @ResponseBody Something functionA() { ... } 

Und:

@RequestMapping(value = "/b", produces = "application/xml") 
public @ResponseBody Something functionB() { ... } 

Auch können Sie die produces und weglassen Seien Sie liberaler in was Sie von Kunden akzeptieren. Mit diesem Ansatz lassen Sie den Kunden wählen zwischen XML, JSON oder was auch immer durch einen Prozess namens Content Negotiation mit Accept Header. In der Tat, feuern, wenn der Client eine Anfrage wie:

GET /a HTTP/1.1 
Accept: application/json 

functionA wird eine JSON-Repräsentation des Rückgabewert zurückgeben, und wenn die Client-Anfrage senden:

GET /a HTTP/1.1 
Accept: application/xml 

functionA wird eine XML-Darstellung der Rückkehr Rückgabewert.

+1

durch die Art und Weise verwenden, es besser ist, hinzuzufügen "; charset = utf-8" zu erzeugt. – Walfrat

+0

Danke, sehr klare Idee !! Für weitere Details könnten wir nur 'produzieren' mit dem Contetn-Typ setzen, der von Konvertern unterstützt wird, die in RequestMappingHandlerAdapter definiert sind? Oder es unterstützt bereits einige Konverter wie JSON oder String, wir müssen sie nicht explizit in XML-Konfigurationsdateien deklarieren? – DONG

+0

Jeder 'HttpMessageConverter' hat einen' getSupportedMediaTypes', der definiert, welche Medientypen dieser Konverter verarbeiten kann. Sehen Sie sich https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/HttpMessageConverter.html an. –

0

Verwenden

@RequestMapping(value = "/url1", produces = "application/json") 

für json und

@RequestMapping(value = "/url2", produces = "application/xml") 

für XML-Ausgabe

Verwandte Themen