鍍金池/ 問答/人工智能  Java/ Spring注解@RequestBody是如何獲取到數(shù)據(jù)的?

Spring注解@RequestBody是如何獲取到數(shù)據(jù)的?

背景:最近在寫SpringBoot與微信小程序,微信小程序有一個(gè)關(guān)于自建Session的問題,需要我在json數(shù)據(jù)中方一個(gè)3rd_session_key來作為用戶的session信息,所以我需要在用戶登錄后的每一條json數(shù)據(jù)中加上這個(gè)3rd_session_key的參數(shù)。于是我準(zhǔn)備用過濾器來filter來實(shí)現(xiàn)。

在實(shí)現(xiàn)這個(gè)邏輯的過程中,遇到了一些問題。

首先,我是實(shí)現(xiàn)了 javax.servlet.Filter 接口,
然后在 doFilter() 方法中通過傳入 ServletRequest 對象來獲取傳入的json數(shù)據(jù),具體我就不做展示了。

此時(shí)就遇到了一個(gè)問題,在過濾器filter中獲取到j(luò)son數(shù)據(jù)以后,我的controller就拿不到數(shù)據(jù)了。后面經(jīng)過一番Google找到了解決方案,就是重寫了HttpServletRequestWrapper的getInputStream() 方法。

我的問題是在Spring中 @RequestBody 是如何實(shí)現(xiàn)拿到前端傳回來的json數(shù)據(jù)的呢?

我有嘗試查看這個(gè) getInputStream() 方法的源碼,但是我卡在了 ServletRequest 這個(gè)接口的 public ServletInputStream getInputStream() throws IOException 方法,我還不知道怎么找接口方法的具體實(shí)現(xiàn)。

感謝。

回答
編輯回答
兮顏

會(huì)不會(huì)是樓主在filter中使用request.getInputStream();
這樣你在filter中就把這個(gè)流的內(nèi)容讀取了
在controller中再次讀取這個(gè)流就讀不到數(shù)據(jù)了.
同一個(gè)流不能被讀取2次哇

2018年3月5日 05:41
編輯回答
心悲涼

恩. @requestbody 就是把HttpServletRequest的輸入(request.getInputStream())通過json,轉(zhuǎn)換成一個(gè)對象.
在spring中是RequestResponseBodyMethodProcessor利用HttpMessageConventer做的.

另外,可以不用這個(gè)注解, 直接將字符串轉(zhuǎn)json, 往json里面添加.

2018年3月30日 18:12