前几天遇到了这个问题,我以为在controller的参数列表中用 list 接收就可以实现,但是报了这个错误:
Failed to instantiate [java.util.List]: Specified class is an interface
因为SpringMVC在封装参数的时候,要实例化你提供的参数类型,List是接口,不能直接实例化,会报"BeanInstantiationException" bean实例化异常。
需要从controller获取页面提交的多个User对象,下面是User类,有id和name两个属性
有些get、set没截全要解决这个问题有两种方案:
1、自己封装。在后台用数组类型接收。例如在参数中用 int[ ] id , String[ ] name 去接收,你会得到数组形式的参数,然后自己封装成User。或者直接用 int id ,String name 接收,你得到的是用逗号拼接的参数。这种方式都不能该直接得到User对象,特别麻烦。(注意:不能用 User[ ] userArray 接收,否则会报NoSuchMethodException)
2、使用中间参数封装。写一个UserModel类:
controller中的参数这样写:(注意在遍历时,一定要对user判空,原因后面会讲到。)
页面这样写:
注意 name 值里的下标,下标前面的 users 和 UserModel 的属性 必须一样,这样做,SpringMVC就可以用你提供的UserModel对象找到它的属性users,再通过这个属性,封装User,最后,你只需要用UserModel的get() 方法就可以得到User集合。(SpringMVC封装时,会按下标顺序封装,如果你的下标是0,2,3,5 框架会把1和4补上,补上的是null,所以在遍历这个list的时候一定要判空!!!)
注意:网上有很多人是复制了别人说的,最后页面部分没有说清楚或者没有复制,大家以为直接写User的属性名就可以,导致获取到的UserModel一直为null,原因就是少了页面部分。
网友评论