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,這個坑千萬注意不要踩。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM