zoukankan      html  css  js  c++  java
  • Springmvc的@ResponseBody方法返回Model时404:跳转jsp视图

    我有一个控制器方法,添加了@ResponseBody注解

    @GetMapping(value = "/users")
    @ResponseBody
    public Map<String, Object> modelAttribute(Model model) {
            return model.asMap();
    }
    

     访问该方法始终返回404,断点发现方法有执行。返回错误如下:

    看到Message 提示是/WEB-INF/views/model/users.jsp 找不到。原来404 是这个,但是很奇怪不是已经添加了@ResponseBody注解吗?

    为什么还会尝试去寻找一个jsp视图呢?

    为此我断点DispatcherServlet并一步步跟踪,其原因是在 HandlerMethodReturnValueHandlerComposite的 调用selectHandler

    寻找 返回值处理器(HandlerMethodReturnValueHandler)时

     private HandlerMethodReturnValueHandler selectHandler(Object value, MethodParameter returnType) {
     		boolean isAsyncValue = isAsyncReturnValue(value, returnType);
     		for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
     			if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
     				continue;
                            }
     			if (handler.supportsReturnType(returnType)) {
     				return handler;
                    }        		}
     		return null;
     }
    

     调用 handler.supportsReturnType(returnType) 这一方法通过返回值来匹配对应的handler,优先匹配到的是 ModelMethodProcessor,

      为何是 ModelMethodProcessor, 查看其supportsReturnType方法:

    public boolean supportsReturnType(MethodParameter returnType) {
        		return Model.class.isAssignableFrom(returnType.getParameterType());
     }
    

     其就是通过检查返回值类型是否Model 接口类型,而ModelMethodProcessor 值处理器 又是跳转视图的,所以即使加了@ResponseBody注解依然会

    去寻找视图。不知道这算不算是一个bug,这个坑千万注意不要踩。

     

  • 相关阅读:
    LInux 安全测试 2
    LInux 安全测试
    又一款linux提权辅助工具
    shell 生成指定范围随机数与随机字符串 .
    腾讯新浪通过IP地址获取当前地理位置(省份)的接口
    建站指南:百度认为什么样的网站更有抓取和收录价值2012-06-20
    ngx_lua 金山项目 黄雀
    在页面中使用js
    多线程取读文件(别人的,有点晕,先放在这里有时间研究研究)
    factory工厂模式
  • 原文地址:https://www.cnblogs.com/xuzimian/p/11005140.html
Copyright © 2011-2022 走看看