您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)@RequestParam參數(shù)偶爾丟失怎么辦,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
改動(dòng)過一版代碼之后, 發(fā)現(xiàn)@RequestParam注解的參數(shù)經(jīng)常丟失.
首先確認(rèn)前端確實(shí)把參數(shù)傳過來了,用curl直接請(qǐng)求接口, 發(fā)現(xiàn)有時(shí)候會(huì)出現(xiàn)參數(shù)丟失, 重啟后再用curl請(qǐng)求某個(gè)丟失參數(shù)的接口, 無論怎么重試都不會(huì)有問題.
沒辦法了, 只好去跟tomcat的源碼, 因?yàn)锧RequestParam的參數(shù)會(huì)從request.getParameterMap()方法里取對(duì)應(yīng)的值, 然后打個(gè)斷點(diǎn)看tomcat怎么獲取的
最終跟到這個(gè)類里, 實(shí)現(xiàn)方法
最終走到coyoteRequest的getParameters方法, 實(shí)現(xiàn)很簡(jiǎn)單
然后getParameterNames();
最終處理查詢參數(shù)
最終就是從queryMB這個(gè)參數(shù)解析出來, 這個(gè)queryMB就是請(qǐng)求時(shí)傳過來的參數(shù),
那就看看當(dāng)getParameterMap為空的時(shí)候, queryMB是否為空, 來判定tomcat一定是接到了參數(shù)
然后發(fā)現(xiàn)queryMB有值, 但是似乎好像上面的方法沒有把這個(gè)參數(shù)解析出來, 開始懷疑一定是某個(gè)接口改了什么東西, 因?yàn)镽equest是可以被循環(huán)利用的, 但是這個(gè)request被再次使用一定是請(qǐng)求結(jié)束了, 后來懷疑是使用了deferedResult, 但也被排除了, 因?yàn)閐eferedResult會(huì)使用servlet3.0以上的異步方式, request不會(huì)被提前循環(huán)使用
百思不得其解的時(shí)候同時(shí)看了這篇文章 豁然開朗,(后來發(fā)現(xiàn)有一個(gè)導(dǎo)入功能比較耗時(shí), 被放在了一個(gè)純異步的方法里, 訪問的方法里有一個(gè)方法被切面切掉了, 并且里面獲取了request.getParameter) request可以傳遞到異步線程, 但要保證在請(qǐng)求返回之前訪問, 如deferedResult set值之前. (為了避免這種情況,還是盡量不要傳到異步線程里了).
@RequestParam:將請(qǐng)求參數(shù)綁定到你控制器的方法參數(shù)上(是springmvc中接收普通參數(shù)的注解)
舉例來說:
如果你的@RequestParam的Value屬性為 pId 那么在請(qǐng)求的鏈接就是
http://localhost:8080/api/findBByParkId?pId=1
value / name
:請(qǐng)求參數(shù)中的名稱 (必寫參數(shù))
required
:請(qǐng)求參數(shù)中是否必須提供此參數(shù),默認(rèn)值是true,true為必須提供default
Value
:默認(rèn)值 測(cè)試成功
關(guān)于“@RequestParam參數(shù)偶爾丟失怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。