2016-05-23 5 views
0

dort.
Ich habe Zweifel über die Rückgabe von JSONObjects auf einem Spring RESTful WebService.Spring RESTful Webservice - Zurückgeben von JSON ohne Modellobjekt

Hier geht es:
Ich habe eine Methode in meinem Controller, die ich möchte, dass es ein JSONObject zurückgibt. Allerdings, wenn ich festgelegt, es ist Rückgabetyp zu JSONObject und effektiv eine JSONObject zurückkehren, erhalte ich die Fehler folgende:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class org.json.JSONObject 

Also, ich wirklich verstehen, was das bedeutet, und ich habe eine Antwort auf diese Frage suchen mindestens 3 Tage.

Hier ist mein Code:

@RequestMapping(value = "/value", method = RequestMethod.POST) 
public String method(HttpServletRequest request) { 
    JSONObject json = new JSONObject(); 
    json.put("example", "example message"); 

    return json.toString(); 
} 

Ich weiß nicht, trully wenn die gonna Arbeit ist, wenn ich es auf dem Front-End verbrauchen (was eine externe Anwendung sein wird). Muss ich eine true JSONObject zurückgeben? Oder die Rückgabe eines JSONObject.toString() sollte gut funktionieren?

Und eine letzte Sache:
Die meisten Tutorials über die Rückgabe eines JSONObject lehrt, dass Prozess mit einem Modellobjekt, das ich nicht verwenden möchte. Gibt es eine Möglichkeit, dies zu tun, ohne ein Modellobjekt zu verwenden?

Vielen Dank im Voraus, guck!

+0

zeigen den fehlerhaften Code. Haben Sie die Methode mit einem Problem mit 'JSONObject' mit' @ ResponseBody' versehen? – chrylis

+0

Ich werde auch bemerken, dass Sie zu unnötigen Schwierigkeiten gehen; Sie könnten einfach eine 'Map ' in diesem Fall zurückgeben, die gut funktionieren würde und weniger kompliziert wäre. – chrylis

+0

@chrylis Nein, mein Controller ist ein '@ RestController', also muss man die Methode nicht mit '@ ResponseBody' annotieren (Richtig?). Daher möchte ich, dass es einen JSON zurückgibt, weil ich diese Antwort nach dem Posten in meiner Aktion mit JQuery (wahrscheinlich AJAX) verwenden möchte. –

Antwort

0

Kommentieren Sie einfach Ihre Methode mit @ResponseBody.

0

Ändern Sie die Klassennotierung in @RestController, und geben Sie dann das Modellobjekt oder Map<String, Object> zurück. Sie brauchen sich nicht mit JSONObject für die Aufgabe zu befassen.

@ResponseBody für die Methode, wie akhill beantwortet, ist auch in Ordnung, aber auch zu ausführlich, wenn der Controller REST ist.

+0

Das große Problem beim Zurückgeben einer Map ist, dass ich meine gesamte Logik als JSONObjects implementiert habe und ich auch mehrere JSONArrays verwende. Ich habe meinen Controller als '@ RestController' annotiert. Würdest du zufällig wissen, ob ich eine json.toString() zurückgeben kann, kann ich sie als JSON im Frontend verwenden? –

+0

Warum sollte sich das Frontend darum kümmern, wie JSON aufgebaut ist? Es endet sowieso als Text! Das einzige mögliche Problem hier ist Pantomime. Sieht so aus, als könnte dieser Beitrag hilfreich sein: http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in-spring-mvc-responsebody –

+0

Danke für die Hilfe bis hier. Also, basierend auf dem, was Sie gerade gesagt haben, wenn ich einen einfachen Text, eine Zeichenfolge von etwa so zurückschicke: '{" name ":" Ihr Name "}', der den JSON darstellt, der im Backend generiert wird, kann ich weiterhin es als JSON am Frontend konsumieren? Ich kann die String-Antwort bereits auf den Browser rendern, das Problem ist: Ich kann keinen Weg finden, es zu konsumieren. –

0

Wenn Sie Jackson zum Mappen verwenden, können Sie stattdessen einen ObjectNode zurückgeben. Es ist Jacksons Darstellung eines JSON-Objekts. Es gibt auch eine ArrayNode-Klasse. Wenn Sie Ihre eigene Implementierung verwenden möchten, schreiben Sie entweder , die das Lesen und Schreiben von json ermöglicht, oder verwenden Sie die toString-Methode, wenn dies tatsächlich eine JSON-Zeichenfolge zurückgibt.

+0

Durch die Rückgabe einer JSON-String, kann ich es auf dem Frontend normal verbrauchen? –

1

Ich hatte das gleiche Problem, und die Lösung ist unglaublich einfach. Ich nehme an, dass Sie Jackson in Ihren Abhängigkeiten haben, und dann können Sie wie folgt vorgehen:

Nachdem Sie eine JSONObject erstellen möchten Sie zurückgeben, einfach schreiben: return jsonObject.toMap(), und Jackson wird den Rest der Arbeit tun. Vergessen Sie nicht, den Rückgabetyp Ihrer Methode in Map<String, Object> zu ändern, und wenden Sie entsprechende Anmerkungen an: für die Methode oder @RestController für eine ganze Klasse. Es hängt von Ihren Bedürfnissen ab.

In Ihrem Fall wird es sein:

@RequestMapping(value = "/value", method = RequestMethod.POST) 
public @ResponseBody Map<String, Object> method(HttpServletRequest request) { 
    JSONObject json = new JSONObject(); 
    json.put("example", "example message"); 

    return json.toMap(); 
} 
Verwandte Themen