如何使用基于注解的Spring MVC控制器在门户中通过AJAX呈现JSON视图/响应?

5
我花了最近的六个小时在Google和stackoverflow上搜寻这个问题的答案。我原本是PHP开发者,所以请耐心等待 - 在PHP控制器中返回JSON数组是微不足道的。
我正在使用Spring MVC 3.0,并且我只想从我的Spring MVC控制器向一些Javascript返回一个JSON对象。目前似乎没有一种简单的方法来使用portlet实现这一点(https://jira.springsource.org/browse/SPR-7344)。我看到的解决方案建议创建另一个DispatcherServlet来提供JSON响应,但我还没有找到一个良好记录的示例。如果有人知道一个好的方法来完成这个(最好是用注释),请告诉我!
5个回答

6

我最终找到了一种解决方案,可以从Spring MVC门户控制器返回“JSON”。这是我的做法。

在我的控制器中:

@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());
}

在“view.jsp”中:
<portlet:resourceURL var="ajaxtest" id="ajaxTest"/>

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

自从@ResourceMapping注释目前不支持返回JSON,我只是使用org.json.JSONObject将我的映射转换为JSON对象,然后返回该对象的toString()。@ResourceMapping的值应该与resourceURL的id匹配。使用eval将JSON字符串转换为Javascript存在安全风险,但我只是包含它,因为它是最简单的例子。如果你担心安全问题,可以使用一个JSON解析器。


2

我能够在Spring 3.0.5中通过两个简单的修改使其工作:

  • 实现自定义WebArgumentResolver以从ResourceRequest body中解析JSON对象
  • 从我的控制器方法返回MappingJacksonJsonView。

仅适用于Spring 3.1 - 您可能希望在MappingJacksonJsonView中使用setExtractValueFromSingleKeyModel

如果有人感兴趣,我可以发布Java代码


0

对@alex的回答进行详细说明:

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

-1

这并不适用于Portlets:请参见https://jira.springsource.org/browse/SPR-7344 - Mark Chorley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接