springmvc 不支持 List 對象做爲 方法的參數

springmvc 不支持 對象的 list 或者 複雜數組對象做爲參數的。 只能是 寫一個 VO了html

` 這樣是不能夠的 @RequestMapping("/add") public void add(Model model,List sysRole){前端

`java

可是若是是基本的類型是能夠的 ` 說了那麼多基礎類型和引用類型區別,最主要的一點就是基礎類型是沒有成員變量的,基礎類型能夠直接是a=x,而引用類型的值大多須要a.b=x才能夠獲得,那麼獲取基礎類型的集合參數是最容易的,好比你有個方法是須要獲取一個int的數組或者list列表,直接在頁面上經過同名的input框就能夠辦到了spring

 

 

 

後臺獲取數組

@RequestMapping("/add")網絡

public void getParmas(String[] titleName)mvc

`app

參考函數

爲何不行?

一些網友的解釋是這樣的測試

那把這個參數封裝到一個對象中,也只能是同setter方法,那問題的關鍵是如何找到這個setter 方法?確定是setName中的name和request中的name對應。這才能找到。你想,若是你單純接收一個list參數,list雖然有get和set方法,可是沒有名字呀,只能根據數組下標來判斷參數位置。因此只能經過第二種方法進行參數傳遞

但是我想了想了,感受不對啊。 若是我是springmvc 開發者,我若是隻知道了 List 的加入類型了,爲何 不能經過反射 對應的放入 對象裏面? 不合理啊。

###坑,百度的不可信

我本身測試了一下。發現網絡上面隨便的百度的仍是有點坑的。

@RequestMapping("/add") public void getParmas(List titleName)

我發現這樣的寫法仍是會報錯的。 而 String[] titleName 是能夠的。

正常的理解方式

爲何 string 類型的 List 不能夠,而 String[] 卻能夠的? 並且原本 原本 前端傳過來的參數,類型默認就是 string 類型,

其實就是 list 的問題 若是單純從報錯的角度來看 Could not instantiate bean class [java.util.List]: Specified class is an interface

它確實list 是一個接口而不是list 實現類。所以也是能夠知道緣由了. 我認爲是 , List 的類型 對應 springMVC 來講,是不能準確獲取到的, List 對應 springmvc 處理來講,它是 List 也就是泛型,不知道具體是什麼類型。 由於 springmvc 的調用controller的方法的方式是 經過反射來 調用的。 同理 Long[] 能夠就是 已經知道類型是 Long 了,也就是 能夠的。

也就是 基本類型和 string的 數組 對象是能夠的。複雜的 數組對象就不行了。

總是報錯什麼數組對象沒有構造函數 網上的

java.lang.NoSuchMethodException: [Lcom.dn.vo.User;.<init>(). 複雜對象的數組沒有構造函數,並且 基本類型的有 是這個意思吧,哈哈。

最後

多是個人springmvc 版本問題比較低, 不支持 List 若是大家誰的支持告訴我一下

 

深刻探究

其實你們深刻想一下,爲何 對象裏面的 List<?> 屬性好比  List<user>

能夠 經過 springmvc 進行入 自動參數賦值進去? 並且也是 List , 

而 方法 參數 直接就是 List<?> 這個是 確定不行的。

反推應該  對象 好比Order 對象裏面的  List<user> 屬性應該不行的,

但是什麼?

實際上是由於經過反射, 若是 方法參數的 List<> 集合類型的,

是不能經過反射獲取  具體 該 集合類放入的是 什麼 類型的。

而若是是 對象, 能夠經過 反射 獲取 對象裏面的 list 屬性的,

是能夠 知道該 list 屬性是 放入什麼 數據類型的。

不信你們能夠 本身 動手 試試,反射是能夠 獲取的。

 

能夠看看我寫的 https://my.oschina.net/u/2419285/blog/1834478  這個文章裏面的思路。

相關文章
相關標籤/搜索