ajaxjsonspring-mvcportletspring-portlet-mvc

How do I render a JSON view/response via AJAX using Spring MVC annotation-based controller for portlets?


I've spent the last six hours scouring Google and stackoverflow for an answer to this question. I'm originally a PHP developer, so bear with me - returning a JSON array from a PHP controller is trivial.

I'm using Spring MVC 3.0, and I simply want to return a JSON object back to some Javascript from my Spring MVC Controller. It seems that there is no easy way to currently do this using a portlet (https://jira.springsource.org/browse/SPR-7344). Solutions I have seen suggest creating another DispatcherServlet that serves up JSON responses, but I have yet to find a well-documented example of this. If anyone knows a good way to accomplish this (preferably with annotations), please do tell!


Solution

  • I ended up finding a workaround to return "JSON" from a Spring MVC portlet controller. Here's how I did it.

    In my 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>
    

    Since the @ResourceMapping annotation currently doesn't support returning JSON, I just used org.json.JSONObject to convert my map to a JSON object, and then returned the toString() of this object. The value of @ResourceMapping should match the id of the resourceURL. The use of eval to convert the JSON string to Javascript poses a security risk, but I just included it because it's the simplest example. If you are worried about security, use a JSON parser.