使用<display:table>时出现RowSorter传入null比较器异常的问题
解决display:table排序时的Null Comparator异常
这个异常的核心原因是开启排序的列没有指定有效的比较器(Comparator),尤其是用JSTL的<c:choose>/<c:if>动态包裹<display:column>时,displaytag的排序机制无法正确识别列的配置,导致获取到null的comparator实例。
具体解决步骤:
给所有可排序列明确指定comparator
displaytag不会自动为所有类型生成比较器,必须手动指定对应类型的comparator:- 字符串类型:
comparator="org.displaytag.util.StringComparator" - 数字类型:
comparator="org.displaytag.util.NumberComparator" - 日期类型:
comparator="org.displaytag.util.DateComparator"
- 字符串类型:
用displaytag自带的
rendered属性替代JSTL标签控制列显示
不要把<display:column>放在<c:choose>内部,而是直接在<display:column>上使用rendered属性控制是否渲染,这样displaytag能正常识别列的排序配置:
错误写法:<c:choose> <c:when test="${user.hasPermission('manage_task')}"> <display:column property="operation" sortable="true" /> </c:when> </c:choose>正确写法:
<display:column property="operation" sortable="true" comparator="org.displaytag.util.StringComparator" rendered="${user.hasPermission('manage_task')}" />排查displaytag版本与配置
确保使用的displaytag版本(如1.2及以上)对动态列排序的支持更稳定,同时检查web.xml中的displaytag filter配置是否正确,避免配置缺失导致的内部逻辑异常。逐步调试定位问题
先移除所有列显示的条件判断,让所有可排序列正常加载并验证排序功能正常,再逐个添加rendered属性控制显示,定位是否某一列的comparator配置遗漏。
内容的提问来源于stack exchange,提问作者Ugito
相关产品推荐
相关产品推荐

