Spring RESTful Webservice – Rückgabe JSON ohne model-Objekt

gibt.

Ich habe eine Frage, mit der Rückkehr JSONObjects auf eine Spring RESTful WebService.

Hier geht es:

Ich habe eine Methode in meinem controller, ich will es zurückgeben eines JSONObject. Allerdings, wenn ich es zurück geben zu JSONObject und effektiv zurück ein JSONObject, bekomm ich folgenden Fehler:

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

So, ich wirklich verstehen, was das bedeutet, und ich habe lange gesucht, eine Antwort auf diese Frage, zumindest für 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 wirklich weiß nicht, ob das funktionieren würde wenn ich Sie zu verbrauchen, auf dem front-end (Die gehen, um eine externe Anwendung). Muss ich haben, um wieder eine wahr JSONObject? Oder wieder ein JSONObject.toString() sollte funktionieren?

Und eine Letzte Sache:

Die meisten tutorials über die Rückkehr eines JSONObject lehrt, dass der Prozess mit einem Modell-Objekt, das ich nicht verwenden möchte. Gibt es eine Möglichkeit, das zu tun, ohne ein Modell-Objekt?

Vielen Dank im Voraus, peeps!

  • Zeigen Sie den fehlerhaften code. Haben Sie kommentieren Sie die Methode, die hatten ein problem mit JSONObject mit @ResponseBody?
  • Ich werde beachten Sie auch, dass Sie gehen, um unnötigen ärger; Sie könnte, schicken Sie einfach eine Map<String,String> in diesem Fall, dass würde funktionieren und wäre weniger kompliziert.
  • Nein, eigentlich ist mein controller ist ein @RestController so gibt es keine Notwendigkeit zu kommentieren die Methode mit @ResponseBody(Richtig?). So, ich möchte es zurückgeben eines JSON, weil ich planen, zu konsumieren, die Reaktion nach der Buchung auf meine Aktion mit JQuery(wahrscheinlich AJAX).
  • Das ist korrekt, aber Sie nicht posten, dass. Also warum nochmal bist du nicht einfach wieder die Karte? Frühling wird es für Sie zu konvertieren, vorausgesetzt Sie haben die JSON-Unterstützung in der Anwendung enthalten (und Sie sollten mit Spring Boot wird).
InformationsquelleAutor Ivan Assalim | 2016-05-23



5 Replies
  1. 1

    Ich hatte das gleiche Problem, und die Lösung ist unglaublich einfach. Ich gehe davon aus, dass Sie Jackson in Ihre Abhängigkeiten, und dann können Sie das wie folgt tun:

    Nachdem Sie ein JSONObject Sie zurückgeben möchten, schreiben Sie einfach: return jsonObject.toMap(), und Jackson wird den rest der Arbeit. Vergessen Sie nicht, ändern Sie den Rückgabetyp der Methode Map<String, Object>, und gelten die entsprechenden Anmerkungen: @ResponseBody auf die Methode, oder @RestController auf eine ganze Klasse. Es hängt von Ihren Bedürfnissen ab.

    In Ihrem Fall es wird 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();
    }
  2. 0

    Klasse ändern Anmerkung zu @RestController, dann wieder model-Objekt oder Map<String, Object>. Sie nicht brauchen, um Durcheinander mit JSONObject für die Aufgabe.

    @ResponseBody für die Methode, wie akhill beantwortet, ist auch ok, aber zu ausführlich, wenn alle die Steuerung ist RUHE.

    • Das große problem über die Rückkehr einer Karte ist, dass ich meine ganze Logik implementiert, wie JSONObjects und ich mit mehreren JSONArrays zu. Ich habe meinen controller annotiert als @RestController. Würden Sie geschehen, zu wissen, wenn ich wieder ein json.toString(), werde ich in der Lage, Sie zu verbrauchen, auf dem front-end als JSON?
    • Warum das frontend kümmern sollte, wie JSON aufgebaut ist? Es endet als ein text sowieso! Die einzig mögliche Anliegen ist, den mime-Typ. Sieht aus wie dieser Beitrag kann helfen: stackoverflow.com/questions/3616359/…
    • Vielen Dank für die Hilfe bis hier. So, die basieren auf, was Sie gerade gesagt haben, wenn ich wieder ein plain-text, eine Zeichenfolge von so etwas wie dieses: {"name":"Your name"} stellt die JSON generiert am backend, die ich noch in der Lage sein, Sie zu verbrauchen, als JSON auf dem front-end? Kann ich schon machen die string response an den browser, das problem ist: ich kann nicht einen Weg finden, Sie zu verbrauchen.
    • Habe ich nicht das problem. Tun Sie nur Ihre $http.post(„/your/url“) und erhalten ein JS-Objekt, was auch immer passiert, auf der server-Seite, so lange, wie es doesn ‚ T geben Sie 500 code.
  3. 0

    Wenn Sie Jackson für das mapping können Sie sich wieder ein ObjectNode statt. Es ist Jacksons Darstellung eines json-Objekts. Es gibt auch eine ArrayNode Klasse. Wenn Sie verwenden möchten Ihre eigene Implementierung dann entweder schreiben Sie eine HttpMessageConverter, die ermöglicht Lesen und schreiben von json oder verwenden Sie die toString-Methode, wenn es dies tatsächlich gibt eine json-string.

    • Durch Rückgabe eines JSON-String, werde ich in der Lage sein, Sie zu verbrauchen, auf der frontend normalerweise?
  4. 0

    Können Sie auch anonyme Objekt:

    new Object() {
        public final int code = 0;
    
        public final List<T> data = ...;
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.