升级到Vaadin 8.14.2后ListSelect组件触发IllegalStateException异常
Vaadin 8.14.2 ListSelect 行数请求超限异常解决方案
你遇到的异常是Vaadin版本升级后触发的内置DoS防护规则,异常详情如下:
java.lang.IllegalStateException: Client tried fetch more rows than allowed. This is denied to prevent denial of service. at com.vaadin.data.provider.DataCommunicator.onRequestRows(DataCommunicator.java:311) at com.vaadin.data.provider.DataCommunicator$SimpleDataRequestRpc.requestRows(DataCommunicator.java:74) at jdk.internal.reflect.GeneratedMethodAccessor370.invoke(Unknown Source)
根因说明
Vaadin 从8.13.0版本开始,为了防止恶意请求拉取全量数据导致服务端资源耗尽,给数据通信层DataCommunicator增加了单次请求行数限制,默认阈值为1000行。升级到8.14.2后,如果你使用的ListSelect一次性加载超过1000条全量数据,就会触发该校验抛出异常。
可选用的解决方法
- 自定义最大请求行数阈值
确认业务场景下全量数据加载是安全的,可直接修改当前ListSelect实例的最大允许行数:
如果需要全局生效所有组件,可在Vaadin的Servlet配置参数中添加如下配置:// 数值根据业务实际最大数据量调整即可 listSelect.getDataCommunicator().setMaxRowsFromClient(2000);vaadin.dataCommunicator.maxRowsFromClient=2000 - 优化数据加载逻辑
数据量较大的场景下,不要将全量数据直接塞给ListSelect,改用CallbackDataProvider实现懒加载:仅在前端滚动到对应位置时,才请求对应分页的少量数据,从根源避免单次请求行数超限。 - 调整组件高度配置
检查是否给ListSelect设置了不合理的高度(比如设置为100%占满父容器,而父容器高度极大),这种情况会让前端判定所有数据都在可视区域内,直接请求全量数据。调整为合理的固定高度,让组件自带滚动效果,也可避免该问题。
内容的提问来源于stack exchange,提问作者avdhesh
相关产品推荐
相关产品推荐

