PrimeFaces+JSF项目DataTable关联对话框下拉框值加载异常问题
问题修复方案
核心原因
报错Target Unreachable, [selectedRole] returned null的核心原因是:
- 编辑按钮默认会处理整个表单(
process="@form"),在JSF应用请求值阶段就会尝试读取对话框中所有输入组件的绑定值,此时selectedRole还未通过点击事件赋值,因此为空。 p:selectOneMenu作为输入组件的校验/值读取逻辑比普通h:inputText更严格,且枚举值没有配置对应转换器也会触发提前的属性访问校验。
修复步骤
步骤1:修改编辑按钮属性
给编辑按钮添加process="@this",仅处理按钮自身的事件,避免提前触发表单中其他输入组件的校验和值读取:
<p:commandButton title="Update" icon="ui-icon-pencil" update="@form:roleDetail" actionListener="#{roleMaintenanceBean.setSelectedRole(role)}" oncomplete="PF('roleDialog').show()" process="@this"> </p:commandButton>
你也可以取消注释f:setPropertyActionListener替代actionListener赋值,两种方式均可。
步骤2:修改下拉框配置,添加枚举转换器
取消下拉框注释,添加JSF内置枚举转换器,指定你项目中RoleStatusEnum的完整类路径:
<p:selectOneMenu id="roleStatusMenu" value="#{roleMaintenanceBean.selectedRole.roleStatus}"> <f:converter converterId="javax.faces.EnumConverter" enumClass="替换为你项目中RoleStatusEnum的全限定类名"/> <f:selectItems value="#{roleMaintenanceBean.roleStatusList}"/> </p:selectOneMenu>
步骤3:(可选)优化Bean初始化
确保RoleMaintenanceBean中roleStatusList在@PostConstruct中完成初始化:
private List<RoleStatusEnum> roleStatusList; @PostConstruct public void init() { roleStatusList = Arrays.asList(RoleStatusEnum.values()); // 其他初始化逻辑 }
步骤4:(可选)优化保存按钮的处理范围
修改保存按钮的process属性,仅处理对话框内的表单内容,避免不必要的全表单校验:
<p:commandButton value="Save" actionListener="#{roleMaintenanceBean.updateRoleDetails}" process="roleDetail" update="@form:basicDT @form:confirmationID"> </p:commandButton>
验证
重启项目后点击编辑按钮,对话框即可正常加载下拉框的选中值,不会再抛出空指针异常。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

