如何使用Spring MVC和多种响应类型支持JSONP

时间:2012-04-25 20:55:01

标签: json spring spring-mvc jsonp jackson

我在控制器中有一个方法,它会根据要求返回HTML或JSON。这是一个这种方法的精简示例,模仿我在this question中找到的有关如何执行此操作的信息:

@RequestMapping(value="callback")
public ModelAndView callback(@RequestParam("c") String c) {
    Map response = new HashMap<String, String>();
    response.put("foo", "bar");
    return new ModelAndView("fake", "data", new JSONPObject(c, response));
}

我将JSONPObject放入模型中,因为我必须能够从呈现是否请求HTML的视图中访问它。但是当我使用回调渲染JSON时,这会产生问题:

curl 'http://localhost:8080/notes/callback.json?c=call'
{"data"call(:{"foo":"bar"})}

正如您所看到的,因为我将数据放在模型的“数据”插槽中,当模型呈现为JSON时,会有额外的包装。我正在寻找的是渲染的JSON(技术上是JSONP)看起来像这样:

call({"data":{"foo":"bar"}})

任何人都可以看到一种方法来获取我想去的地方而不会破坏在渲染过程中返回访问JSONPObject的视图的能力吗?

2 个答案:

答案 0 :(得分:7)

这就是我在Spring MVC中使用JSONP的方法,只需根据您的需要进行修改:

服务器端的

@RequestMapping(value="/notes/callback.json", method=RequestMethod.GET)
public void jsonpCallback(@RequestParam("callback") String callback, HttpServletResponse response) {
   response.setContentType("text/javascript; charset=UTF-8");
   PrintWriter out = response.getWriter();
   out.print(callback + "(" + jsonDataString + ")");
}

在客户端:

<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script type="text/javascript">

function yourfunction() {
    jQuery.getJSON("http://localhost:8080/notes/callback.json?callback=?", 
        function(data) {
            alert(data.someParam);
        });
}

</script>

答案 1 :(得分:0)

我想出来了。渲染JSON时,Spring根据我的配置使用MappingJacksonJsonView。该视图有一个属性,告诉它在地图中找到单个项目并在渲染之前将其提取出来。设置该属性后,现在可以正常工作。

    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" >
                <property name="extractValueFromSingleKeyModel" value="true" />
            </bean>
        </list>
    </property>