Einfachen string als JSON-Rückgabe-Wert im Frühjahr die rest-controller
Werfen wir einen Blick auf die folgenden einfachen test controller (mit Feder 4.0.3):
@RestController
public class TestController
{
@RequestMapping("/getList")
public List<String> getList()
{
final List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
return list;
}
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
In der Theorie sowohl controller als Methoden sollte die Rückkehr gültiges JSON. Aufruf der ersten controller-Methode tatsächlich nicht zurückgeben, die folgende JSON-array:
$ curl -i -H "Accept: application/json" http://localhost:8080/getList
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
["1","2"]
Aber der zweite controller-Methode gibt den string ohne Anführungszeichen, das ist kein gültiges JSON-string:
$ curl -i -H "Accept: application/json" http://localhost:8080/getString
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Hello World
Warum ist das so? Kann es konfiguriert werden? Ist es ein bug? Oder ein feature, das ich nicht verstehe?
- Schauen Sie in
StringHttpMessageConverter
die ia registriert, bevor die jackson-Konverter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zurückkehren, wenn Sie eine
String
Objekt, Spring MVC interpretiert, als der Inhalt in der Antwort der Körper und nicht ändern es weiter. Wenn Sie wollen, sind eine eigentliche string der JSON-Antwort, dann müssen Sie entweder nennen Sie es selbst, oder führen Sie es durch Jackson explizit.Accept
- header in der Anforderung, die einzige gültige Antwort muss der content-typeapplication/json
so den Frühling zu verwenden hat Jackson für die Antwort und Jackson sollte Valide JSON. In diesem Fall die Antwort ist einfach ungültig. Es hat content-typeapplication/json
aber wurde nicht in JSON.ResponseBody
bedeutetResponseBody
, die letztlich eine Folge von bytes, und im Frühjahr nur Konvertierungen, wenn es nicht passen die Java-Typen in Frage;String
braucht keine Konvertierung.Können Sie entfernen Sie die
StringHttpMessageConverter
eingetragen, bevor die jackson-Konverter, - wie schon in den Kommentar.converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
Wenn Sie zurückkehren möchten, die ein String-Objekt, Spring MVC interpretiert, als der Inhalt in der Antwort der Körper und nicht ändern es weiter. Wenn Sie wollen, sind eine eigentliche string der JSON-Antwort, dann müssen Sie entweder nennen Sie es selbst, oder führen Sie es durch Jackson explizit.
Hier sind die Schritte, die ich Tat, um dies zu erreichen :
Add dependency in der pom-Datei:
Setzen
@ResponseBody
annotation an der Methode, wie diese: