Spring自动填充列表的最大大小是多少?

11

我在Spring AutoPopulatingList中遇到了问题。我的使用案例是:管理可以访问应用程序的用户列表。

在GUI方面,我使用一个自动完成字段来搜索并将用户添加到右侧的表格中。用户也可以从表格中删除。 当GUI用户提交时,GUI会动态构建一个带有用户字段的表单:selectedUsers [1],...,selectedUsers [N]。

我的问题是,在我的“后台”bean中,AutoPopulatingList似乎只增长到256个项目,然后停止。因此,我会收到以下错误:

[myapp.web.controller.admin.form.ApplicationForm]: Invalid list index in property path 'selectedUsers[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256

您知道是否存在实际限制吗?如果是,是否有提高它的方法? 如果没有,您能想到解决此问题的方法吗?

先感谢您的帮助

3个回答

24

好的,所以我进一步了解了Spring的内部结构,并发现默认情况下限制为256。

这个限制是由BeanWrapperImpl#autoGrowCollectionLimit属性给出的。 Spring的WebDataBinder默认配置将其设置为256。

提高此限制的正确方法是在您的控制器中定义一个@InitBinder注释的方法:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAutoGrowCollectionLimit(1024);
}

然后一切都按预期工作。

我没有尝试找到一种全局修改此限制的方法。

希望对你有所帮助。


1
你可以将这段代码放在一个带有@ControllerAdvice注解的类中,以便为所有控制器进行配置。请参阅http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html。 - Nils Breunese
最糟糕的部分是那些晦涩难懂的错误信息,比如“索引超出范围”。 - Cat-Lord

3

在Java中,List是从0开始索引的。第一个索引是selectedUsers[0],最后一个索引是selectedUsers[255],如果列表包含256个元素。

看起来你正在尝试访问selectedUsers[256](第257个元素),而列表只包含256个元素。


2
感谢您的回答。是的,问题是一个大小问题。该列表由Spring从HTTP请求自动填充。我的问题是,有超过256个元素需要映射到该列表上。我不知道Spring在哪里指定了256的限制,也不知道我可以在哪里提高它。 - Olivier Jacob

0
经过一些阅读,看起来有一个“LazyList”接口,你可以使用“getBlocks()”方法告诉Spring“嘿,这个列表可以扩展”。
在这里看到一个完整的例子: http://mattfleming.com/node/134 但是我似乎无法在自己的项目中使其工作。我认为需要某种@Bean接口?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接