這篇文章帶給大家的內容是關於Spring MVC無法正常取得參數的值的解決方法(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
最近在開發時遇到一個非常奇怪的問題,在tomcat8中使用Spring MVC框架,在Controller中的方法參數無法正常取得到對應的值,將tomcat版本換成7.0就解決了。
記錄下列解決過程,先上圖:
#
##專案採用ssm架構,這裡取得不到參數password的值,在網路上查詢相關資料,得到以下幾個解決方法,但都沒有什麼效果:1.使用@RequestParam註解給password參數加上了RequestParam註解後,調試依然無法取得到password的值,將required的值改為true,直接報錯了,錯誤的意思就是缺少password參數,可是明明傳了參數的啊,為什麼還說缺少參數呢,難道是沒能夠辨識到我傳的參數?這時候考慮到可能是傳參方式的問題。更改了一下傳參方式,將password的值附加到url後面,就像GET請求那樣傳參。果然是這個原因,參數的值能夠接收到了。不過使用這種傳參方式,不加RequestParam註解也能夠接收到參數的值。雖然這種方法能夠接收接收到參數的值了,但我無法忍受POST的這種傳參方式,於是接著尋找下一個方法 2.使用@ RequestBody註解 RequestBody看字面意思就是請求的body,我在請求的時候確實是將參數放到body裡面傳遞過去的,看到這個註解感覺貌似看到了希望一樣,於是迫不及待的重啟tomcat,然後用Postman調用,這次直接斷點都不進了,直接報了一個異常:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public boolean com.scdq.manager.controller.SystemController.login(java.lang.String)異常的大概意思是缺少必要的請求body,透過查詢相關資料,發現RequestBody並不這麼用,需用建立一個類,在類別中定義相關的參數,然後再將這個類別作為RequestBody註解的參數的類型##以這種方式修改好了代碼,再次重啟tomcat,使用Postman調用,然後再次報了一個異常:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' not supported
異常的大概意思是不支援content type為application/x-www-form-urlencoded這種類型,一般透過表單提交的資料預設就是這種類型,猜測可能是RequestBody註解的原因,於是又換了一種傳參方式:使用JSON格式傳遞資料
#
使用這種傳參方式,果然能夠接收參數的值了,不過接收參數的方式和傳參方式都變得複雜了。這個專案是我從公司拷回家繼續寫的,在公司的時候調試一切正常,回家就不行了,百思不得其解,同樣的程式碼,改都沒改過,為什麼回到家就出問題了呢?既然程式碼都是一樣的,運行結果不一樣,那就只能說明運行的環境改變了。那麼到底是哪裡的環境不一樣呢?出了這種問題,首先考慮資料庫的結構,不過家裡電腦資料庫版本和公司電腦是一致的,而且資料都是從公司直接拷回來的,所以直接排除資料庫的原因,更何況這是在Controller中接收不到參數,還沒到存取資料庫的那一步,就更不可能與資料庫有關係了,所以直接排除資料庫的原因。由於專案是由maven建置的,相關的jar包都是maven自動去下載的,於是懷疑會不會是maven自動下載下來的jar包有問題,然後把本地倉庫的jar包全部刪除,讓maven從新去下載,就這樣重複了幾次,問題依然存在,不得已只好暫時排除maven的原因。最後實在想不到其他的原因了,便開始懷疑tomcat的原因,公司tomcat是7.0版本的,家裡的tomcat是8.0版本的,雖然兩個tomcat版本不一致,不過並沒有下意識就覺得一定是tomcat版本的原因,畢竟潛意識裡認為8.0一定是7.0之後功能的升級。雖然這樣想,但還是抱著死馬當活馬醫的心態去測試,在tomcat官網下載7.0版本的壓縮包,然後配好相應的環境,用postman調用,結果就是這麼意外,參數值獲取到了? ! ! !還真是tomcat版的原因?這感覺也太坑了吧。 。 。 。看來盲目的追求高版本並不是好事【相關推薦:Java教學】
以上是Spring MVC不能正常取得參數的值的解決方法(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!