Primefaces 10 DataTable渲染报错Table 'var'和Column 'field'属性不能为空
触发原因
- 直接诱因是
durada列的sortBy属性赋值为空字符串sortBy="",根据你贴的Primefaces UITable源码,解析排序规则时会校验field值非空,空字符串会触发校验失败抛出异常。 - Primefaces 10处理dataTable排序逻辑时,无论表格绑定的数据集是否为空,只要表格处于渲染状态,就会预先解析所有列的sortBy属性生成排序规则,所以即使itemss是空列表,依然会执行sortBy解析逻辑,触发异常。
- 额外说明:你当前给dataTable配置的
rendered="#{empty personaFormacioBean.itemss}"逻辑存在明显问题:该配置表示只有当itemss为空时才渲染表格,有数据时表格反而不展示,和常规使用逻辑相悖,也放大了空列表下的报错概率。
解决方案
- 修复异常列配置:处理
durada列的空sortBy属性- 如果该列需要排序:将sortBy补全为对应字段,改为
sortBy="#{item.modul.durada}" - 如果该列不需要排序:直接删除空的sortBy属性,同时添加
sortable="false"关闭该列的排序能力,避免Primefaces解析无效排序字段
- 如果该列需要排序:将sortBy补全为对应字段,改为
- 修正dataTable渲染逻辑:
- 如果你需要实现「有数据展示数据、无数据展示emptyMessage提示」的常规效果,直接删除dataTable上的
rendered="#{empty personaFormacioBean.itemss}"配置即可,Primefaces的emptyMessage会自动在数据集为空时生效,无需手动控制渲染条件。 - 如果确实需要特殊渲染控制,建议调整为
rendered="#{personaFormacioBean.itemss != null}",避免空指针同时兼容有无数据的场景。
- 如果你需要实现「有数据展示数据、无数据展示emptyMessage提示」的常规效果,直接删除dataTable上的
- (可选优化)如果不需要全局默认排序,可以删除dataTable上的
sortBy和sortOrder全局配置,进一步降低排序逻辑的异常风险。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

