问题描述
spring(我用的spring的版本是4.1.1.RELEASE)对jsonp的响应提供了内置实现,网上搜出一大把关于如下配置的文章,但我配了N久,在url后加callback=callback怎么着都不出效果,很是纳闷
spring配置如下:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
<entry key="jsonp" value="application/javascript" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="jsonpParameterNames">
<set>
<value>jsonp</value>
<value>callback</value>
</set>
</property>
</bean>
</list>
</property>
</bean>
controller代码如下:
@ResponseBody
@RequestMapping("/test")
public Object testJsonp() {
Map map = new HashMap();
map.put("aaa", "bbb");
return map;
}
原因排查
不得已,在spring的源码上打了多处断点,查查到底是哪里出现了问题。 有这些地方打了断点:
org.springframework.web.servlet.view.json.MappingJackson2JsonView.filterAndWrapModel(Map<String, Object> model, HttpServletRequest request) 213行
org.springframework.web.servlet.ViewRendererServlet.renderView(HttpServletRequest request, HttpServletResponse response) throws Exception 115行
org.springframework.web.servlet.DispatcherServlet.render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception 1228行
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception 997行
最终发现问题出现在这里
if (mv != null && !mv.wasCleared()) {
render(mv, request, response);
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
mv即ModelAndView对象,因这个对象为空,所以没有走render逻辑,也就没有执行MappingJackson2JsonView.filterAndWrapModel
中的container.setJsonpFunction(jsonpParameterValue);
,所以callback没有效果。
原因找到了,修改代码如下:
@ResponseBody
@RequestMapping("/test")
public ModelAndView testJsonp() {
ModelAndView mv = new ModelAndView();
mv.addObject("aaa", "bbb");
return mv;
}
万事大吉,一切ok~