记一次@ResponseBody注解不生效问题
1、需求引入
前端(postman)調用后端方法要求如下這樣調用,使用raw,格式是application/json,并且要求返回json格式字符串
 
2、示例代碼
后端可以使用如下方式接收,以及返回
 在Controller中,我們如果調用方法時入參是json,而方法實際參數是一個Java bean對象,我們可以加入@RequestBody注解,來把json串解析成我們的Java bean對象,返回使用@ResponseBody,將Java對象改成json格式出參,代碼如下:
3、問題出現
正常來說結果應該是正常的,但是我確404如下:
 
4、原因分析
這就很奇怪了,我明明加了ResponseBody注解,這應該是不加這個注解會報的錯,(ps.因為不加這個注解,會默認返回頁面,而spring找不到這個頁面,會報404錯誤,而加上此注解,標識此時應該返回的是數據,而不是頁面。),然后百度了各種解決辦法,什么缺jar包的,什么直接使用@RestController(ps.@RestController=@Controller+@ResponseBody)都不生效,然后決定從源碼入手。。。
5、解決問題
最后發現項目中自定義了返回值處理類,將本該處理@ResponseBody的處理類RequestResponseBodyMethodProcessor替換成了自己項目的處理器類,由此導致了@ResponseBody。最后把RequestResponseBodyMethodProcessor加入到RequestMappingHandlerAdapter對應的returnValueHandlers中,問題解決。大家如果碰到類似問題,可以debug HandlerMethodReturnValueHandlerComposite類的selectHandler方法,如下,handler是不是正確的,正常來說@ResponseBody對應RequestResponseBodyMethodProcessor;看this.returnValueHandlers中是否有RequestResponseBodyMethodProcessor處理器類,如果沒有加進去就解決問題了
 
終于得到了想要的結果
 
總結
spring原生的的HandlerMethodReturnValueHandler大概一共有15個處理器類,分別處理不同的返回類型,其中RequestResponseBodyMethodProcessor是處理返回json類型的,當方法使用@ResponseBody注解時,便會調用此處理器類,需檢查returnValueHandlers中是否有RequestResponseBodyMethodProcessor處理器類
參考文檔:
 Spring MVC源碼(三) ----- @RequestBody和@ResponseBody原理解析
總結
以上是生活随笔為你收集整理的记一次@ResponseBody注解不生效问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: elasticsearch常见错误解决办
- 下一篇: Spring中Bean创建完成后执行指定
