如何通过Spring MVC和多种响应类型支持JSONP


问题内容

我在控制器中有一个方法,该方法将根据要求返回HTML或JSON。这是这种方法的精简示例,以我在此问题中发现的有关如何执行此操作的信息为模型:

@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的视图的功能?


问题答案:

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

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