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