springmvc 不支持 对象的 list 或者 复杂数组对象作为参数的。 只能是 写一个 VO了
` 这样是不可以的 @RequestMapping("/add") public void add(Model model,List sysRole){
`
但是如果是基本的类型是可以的 ` 说了那么多基础类型和引用类型区别,最主要的一点就是基础类型是没有成员变量的,基础类型可以直接是a=x,而引用类型的值大多需要a.b=x才可以得到,那么获取基础类型的集合参数是最容易的,比如你有个方法是需要获取一个int的数组或者list列表,直接在页面上通过同名的input框就可以办到了
后台获取
@RequestMapping("/add")
public void getParmas(String[] titleName)
`
为什么不行?
一些网友的解释是这样的
那把这个参数封装到一个对象中,也只能是同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 这个文章里面的思路。