jsonpParameterNames不生效问题排查

问题描述

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~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值