JSF点击Save All报错:studentAttendanceSchoolWrapper标识符解析为null
根因分析
你遇到的报错核心原因是:点击Save All按钮执行process=@form提交全表单时,JSF进入更新模型阶段处理<p:columns>头部的全选复选框,此时<p:columns>的遍历上下文丢失,无法解析var="studentAttendanceSchoolWrapper"对应的变量,导致识别为null。
勾选全选时正常是因为全选的ajax仅process="@this",此时<p:columns>处于渲染/事件处理的遍历上下文内,变量可以正常解析。
解决方案
直接修改全选复选框的value绑定逻辑,不依赖<p:columns>的var变量,用列索引直接从Controller的列表中取值即可:
找到你xhtml中全选复选框的代码:
<p:selectBooleanCheckbox id="sbcbPresentAll" value="#{studentAttendanceSchoolWrapper.transientCheckAll}" styleClass="mt-2" disabled="#{studentAttendanceSchoolWrapper.studentAttendanceSchoolDtos[col].holiday}">
替换为:
<p:selectBooleanCheckbox id="sbcbPresentAll" value="#{studentAttendanceSchoolController.studentAttendanceSchoolWrappers[col].transientCheckAll}" styleClass="mt-2" disabled="#{studentAttendanceSchoolController.studentAttendanceSchoolWrappers[col].studentAttendanceSchoolDtos[col].holiday}">
同时把头部里所有用到studentAttendanceSchoolWrapper的地方,都替换为studentAttendanceSchoolController.studentAttendanceSchoolWrappers[col],彻底脱离对var变量的依赖。
可选优化
如果transientCheckAll仅作为前端全选的临时开关,不需要持久化也不需要在提交表单时更新,也可以给Save All按钮设置process属性,指定仅处理表格行内的考勤复选框,排除头部的全选组件,避免触发不必要的模型更新。
内容的提问来源于stack exchange,提问作者paawan
相关产品推荐
相关产品推荐

