/ / Wie kann ich eine JSON-Ansicht / -Antwort über AJAX mit einem Spring MVC-Kommentar für Portlets rendern? - Ajax, Json, Spring-MVC, Portlet, Spring-Portlet-MVC

Wie rende ich eine JSON-Ansicht / -Antwort über AJAX mithilfe von Annotation-based Controller von Spring MVC für Portlets? - Ajax, JSON, Feder-Mvc, Portlet, Feder-Portlet-Mvc

Ich habe die letzten sechs Stunden damit verbracht, Google zu durchsuchenstackoverflow für eine Antwort auf diese Frage. Ich bin ursprünglich ein PHP-Entwickler, also halten Sie sich an mich - ein JSON-Array von einem PHP-Controller zurückzugeben ist trivial.

Ich verwende Spring MVC 3.0, und ich möchte einfach ein JSON-Objekt von meinem Spring-MVC-Controller an etwas Javascript zurückgeben. Es scheint, dass es derzeit keine einfache Möglichkeit gibt, dies mithilfe eines Portlets (https://jira.springsource.org/browse/SPR-7344) zu tun. Lösungen, die ich gesehen habe, schlagen vor, ein weiteres DispatcherServlet zu erstellen, das JSON-Antworten bereitstellt, aber ich habe noch kein gut dokumentiertes Beispiel dafür gefunden. Wenn jemand einen guten Weg kennt, um dies zu erreichen (vorzugsweise mit Anmerkungen), erzählen Sie es bitte!

Antworten:

6 für die Antwort № 1

Ich fand schließlich eine Problemumgehung, um "JSON" von einem Spring MVC-Portlet-Controller zurückzugeben. So habe ich es gemacht.

In meinem Controller:

@ResourceMapping("ajaxTest")
public void ajaxHandler(ResourceRequest request, ResourceResponse response)
throws IOException {
OutputStream outStream = response.getPortletOutputStream();
StringBuffer buffer = new StringBuffer();

Map<String, String> testMap = new HashMap<String, String>();
testMap.put("foo", "bar");

String test = new JSONObject(testMap).toString();
buffer.append(test);

outStream.write(buffer.toString().getBytes());
}

In "view.jsp":

<portlet:resourceURL var="ajaxtest" id="ajaxTest"/>

<script type="text/javascript">
$.get("<%= ajaxtest %>", function(response) {
var json = eval("(" + response + ")");
});
</script>

Seit der Annotation @ResourceMapping derzeitDie Rückgabe von JSON wird nicht unterstützt. Ich habe gerade org.json.JSONObject verwendet, um meine Karte in ein JSON-Objekt zu konvertieren, und dann das toString () dieses Objekts zurückgegeben. Der Wert von @ResourceMapping sollte mit der ID der resourceURL übereinstimmen Von eval die Konvertierung des JSON-Strings in Javascript stellt ein Sicherheitsrisiko dar, aber ich habe es nur eingefügt, weil es das einfachste Beispiel ist. Wenn Sie sich Sorgen um die Sicherheit machen, verwenden Sie einen JSON-Parser.


3 für die Antwort № 2

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/ gilt derzeit nicht für Portlets. Sehen: https://jira.springsource.org/browse/SPR-7344


2 für die Antwort № 3

Ich konnte es in Spring 3.0.5 mit zwei einfachen Modifikationen zum Laufen bringen:

  • Implementieren von benutzerdefiniertem WebArgumentResolver zum Analysieren eines Objekts aus JSON aus dem ResourceRequest-Body
  • MappingJacksonJsonView von der Methode meines Controllers zurückgeben.

Nur in Spring 3.1 verfügbar. Möglicherweise möchten Sie setExtractValueFromSingleKeyModel in Ihrer MappingJacksonJsonView verwenden

Wenn sich jemand im Intereset befindet, kann ich Java-Code posten


0 für die Antwort № 4

Antwort auf @alex Antwort:

    @ResourceMapping(value = "showJson")
public ModelAndView showJson(ResourceRequest request) {
ModelAndView mav = new ModelAndView(new
MappingJacksonJsonView());
mav.addObject("key", myBeanToBeSerializedAsJson);
return mav;
}

-1 für die Antwort № 5

Ab Spring 3 beginnt eine Steuerungautomatisch in json konvertieren, wenn ajax get / post mit dem Anwendungstyp json verwendet wird (d. h. .getJSON und .postJSON in jQuery). Diese Funktionalität ist zwischen den Servlet- und Portlet-Varianten von Spring MVC identisch.

Hier ist ein Blogpost, der es erklärt.

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/