1. 程式人生 > >Spring @RequestParam必須要加上引數名

Spring @RequestParam必須要加上引數名

一、使用方式

看網上資料學spring時,都在說

1.直接寫@RequestParam就行了,會把請求中同名引數繫結到方法上。
2.如果引數名和變數名不一致,可以使用@RequestParam(name),告訴spring,使用指定名字入參。

第一這種講法明明是錯誤的。只有在debug模式編譯時,引數名才會保留在class檔案中,spring由此可以反射繫結。我們的應用明顯不可能在debug模式下打包。因此第一種誤人子弟啊,老師告訴你很簡單的預設值做法是錯誤的,第二種方式才是正確的寫法。

二、驗證說明

eclipse有個編譯開關,會把變數寫入到class檔案中。因此需要明確告訴Spring入參。

1、設定編譯開關

右擊專案,選擇“屬性”,開啟“屬性對話方塊”,選擇“Java Compiler”然後再開啟的選項卡將“Add variable attributes to generated class files”取消勾選,意思是不將區域性變數資訊新增到類檔案中

2、取消勾選和勾選後class檔案對比

取消勾選,變數名為arg0,即未儲存定義的變數名urlId:


勾選後,變數名為urlId儲存在class檔案中:

3、呼叫測試

取消勾選:


控制檯報錯:java.lang.IllegalArgumentException: Name for argument type [java.lang.Integer] not available, and parameter name information not found in class file either.


勾選後:

4、eclipse打war包後釋出到本地tomcat伺服器

取消勾選與勾選後請求結果與3相同。即勾選後可以正常響應,未勾選報錯。

5、新增name屬性後,無論勾不勾選,都可正常響應。

三、總結

為防止上述情況的發生,@RequestParam必須要加上引數名