@RequestParam 參數(shù)偶爾丟失的解決
@RequestParam參數(shù)丟失
改動過一版代碼之后, 發(fā)現(xiàn)@RequestParam注解的參數(shù)經(jīng)常丟失.
首先確認前端確實把參數(shù)傳過來了,用curl直接請求接口, 發(fā)現(xiàn)有時候會出現(xiàn)參數(shù)丟失, 重啟后再用curl請求某個丟失參數(shù)的接口, 無論怎么重試都不會有問題.
沒辦法了, 只好去跟tomcat的源碼, 因為@RequestParam的參數(shù)會從request.getParameterMap()方法里取對應(yīng)的值, 然后打個斷點看tomcat怎么獲取的
最終跟到這個類里, 實現(xiàn)方法
最終走到coyoteRequest的getParameters方法, 實現(xiàn)很簡單
然后getParameterNames();
最終處理查詢參數(shù)
最終就是從queryMB這個參數(shù)解析出來, 這個queryMB就是請求時傳過來的參數(shù),
那就看看當(dāng)getParameterMap為空的時候, queryMB是否為空, 來判定tomcat一定是接到了參數(shù)
然后發(fā)現(xiàn)queryMB有值, 但是似乎好像上面的方法沒有把這個參數(shù)解析出來, 開始懷疑一定是某個接口改了什么東西, 因為Request是可以被循環(huán)利用的, 但是這個request被再次使用一定是請求結(jié)束了, 后來懷疑是使用了deferedResult, 但也被排除了, 因為deferedResult會使用servlet3.0以上的異步方式, request不會被提前循環(huán)使用
百思不得其解的時候同時看了這篇文章 豁然開朗,(后來發(fā)現(xiàn)有一個導(dǎo)入功能比較耗時, 被放在了一個純異步的方法里, 訪問的方法里有一個方法被切面切掉了, 并且里面獲取了request.getParameter) request可以傳遞到異步線程, 但要保證在請求返回之前訪問, 如deferedResult set值之前. (為了避免這種情況,還是盡量不要傳到異步線程里了).
@RequestParam的用法注意事項
作用
@RequestParam:將請求參數(shù)綁定到你控制器的方法參數(shù)上(是springmvc中接收普通參數(shù)的注解)
舉例來說:
如果你的@RequestParam的Value屬性為 pId 那么在請求的鏈接就是
http://localhost:8080/api/findBByParkId?pId=1
@RequestParam屬性
value / name
:請求參數(shù)中的名稱 (必寫參數(shù))required
:請求參數(shù)中是否必須提供此參數(shù),默認值是true,true為必須提供defaultValue
:默認值 測試成功
注意
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot http post請求數(shù)據(jù)大小設(shè)置操作
這篇文章主要介紹了SpringBoot http post請求數(shù)據(jù)大小設(shè)置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09解決SpringMVC、tomcat、Intellij idea、ajax中文亂碼問題
這篇文章主要介紹了解決SpringMVC、tomcat、Intellij idea、ajax中文亂碼問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Spring的攔截器HandlerInterceptor詳解
這篇文章主要介紹了Spring的攔截器HandlerInterceptor詳解,攔截器是相對于Spring中來說的,它和過濾器不一樣,過濾器的范圍更廣一些是相對于Tomcat容器來說的,攔截器可以對用戶進行攔截過濾處理,需要的朋友可以參考下2024-01-01SpringMVC?HttpMessageConverter報文信息轉(zhuǎn)換器
這篇文章主要為大家介紹了SpringMVC?HttpMessageConverter報文信息轉(zhuǎn)換器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05