Spring Web MVC中映射数组及Collection类
在上文中我提到了在command对象的构造器中添加:options = ListUtils.lazyList(new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class));来解决org.springframework.beans.InvalidPropertyException: Invalid property 'options[0]' of bean class [Question]: Index of out of bounds in property path 'options[0]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的问题,但是在开发过程中发现,仍存在着问题。
使用上面的方法,当这个Question对象是第一次录入的时候就没有问题,更改Option也没有问题,但是如果用户增加Question中的option的数目时,还会遇到上面的问题,当然,这个时候不是index:0, size: 0,而是index是question中线有的options的数目。
从网上找了很久,没有答案,迫不得已去看Spring的源代码,发现Spring在绑定对象的时候,先从Cache中拿出原来的对象,并且根据现在提供的数据,一次拿出原数据,显而易见问题就出在这里,因为原来Question中只有5个option,现在用户添加了一个,那么当Spring去找第6个Option时,肯定会出现我们上面遇到的问题。因为仅仅读了关于绑定这一部分代码,所以我不想更改Spring。
那么我们重新把注意力放在构造器的更改上面,既然通过增加一行代码可以让新的Question对象正确地去的数据,那么完全可以把这一行代码添加到getOptions方法中,这样一来,在每次取得options这个List时,都对他进行的Lazy处理。
准备改的时候,想到,添加这一行代码仅仅是为了Spring的应用,那么如果当我们把这一部分换成Struts或者其他框架的时候,这一行代码显然是多余的,那么反而不如在Spring的controller里面进行处理。
修改Controller,哈哈哈,工作了。
Question question
=
....
//
getQuestion;
if
(question
==
null
)
{
Question = new Question();
question.setOptions(ListUtils.lazyList(new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class)));
}
else
{
question.setOptions(ListUtils.lazyList(question.getOptions(),FactoryUtils.instantiateFactory(Option.class)));
}
可以看到,在else里面使用的是question中已经拿到的option,而不是新建一个ArrayList对象。
版权所有: idilent 网站转载请注明作者并链接到http://blog.csdn.net/idilent,
其他转载方式请与作者联系(idilent@yahoo.com.cn)。
在上文中我提到了在command对象的构造器中添加:options = ListUtils.lazyList(new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class));来解决org.springframework.beans.InvalidPropertyException: Invalid property 'options[0]' of bean class [Question]: Index of out of bounds in property path 'options[0]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的问题,但是在开发过程中发现,仍存在着问题。
使用上面的方法,当这个Question对象是第一次录入的时候就没有问题,更改Option也没有问题,但是如果用户增加Question中的option的数目时,还会遇到上面的问题,当然,这个时候不是index:0, size: 0,而是index是question中线有的options的数目。
从网上找了很久,没有答案,迫不得已去看Spring的源代码,发现Spring在绑定对象的时候,先从Cache中拿出原来的对象,并且根据现在提供的数据,一次拿出原数据,显而易见问题就出在这里,因为原来Question中只有5个option,现在用户添加了一个,那么当Spring去找第6个Option时,肯定会出现我们上面遇到的问题。因为仅仅读了关于绑定这一部分代码,所以我不想更改Spring。
那么我们重新把注意力放在构造器的更改上面,既然通过增加一行代码可以让新的Question对象正确地去的数据,那么完全可以把这一行代码添加到getOptions方法中,这样一来,在每次取得options这个List时,都对他进行的Lazy处理。
准备改的时候,想到,添加这一行代码仅仅是为了Spring的应用,那么如果当我们把这一部分换成Struts或者其他框架的时候,这一行代码显然是多余的,那么反而不如在Spring的controller里面进行处理。
修改Controller,哈哈哈,工作了。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
版权所有: idilent 网站转载请注明作者并链接到http://blog.csdn.net/idilent,
其他转载方式请与作者联系(idilent@yahoo.com.cn)。