PrimeFaces 6.2 CRUD应用模态对话框更新记录不生效问题求助
问题根源&修复方案
1. 托管Bean作用域错误
你当前使用@RequestScoped,每次HTTP请求都会重建Bean实例:点击行的更新按钮设置selectedCustomer是一次请求,点击对话框的保存按钮又是新的请求,此时selectedCustomer已经被重置为新的空对象,更新自然不生效。
修改CustomerBean的作用域为@ViewScoped:
import javax.faces.bean.ViewScoped; // 注意导入正确的包 @ManagedBean @ViewScoped // 替换原来的@RequestScoped public class CustomerBean { // 原有代码不变 }
2. 前端保存按钮属性配置错误
- 你设置了
ajax="false",会导致update、process等AJAX专属属性完全失效 - 组件ID引用错误:你的表单ID是
customerForm,不是form,所有引用form:xxx的地方都要修正
修改对话框的保存按钮代码:
<p:commandButton value="Save" action="#{customerBean.updateCustomerDetails}" update=":customerForm:msgs :customerForm:basicDT" process=":customerForm:customerDetail @this" oncomplete="if (args && !args.validationFailed) PF('customerDialog').hide()" />
修改后可以删掉updateCustomerDetails方法里的PrimeFaces.current().executeScript("PF('customerDialog').hide()")这行,避免重复执行。
3. 后台更新组件ID错误
你代码里更新的组件ID和实际定义的不匹配:
- 消息组件ID是
msgs,不是messages - 表格
basicDT属于customerForm,不是form
修改updateCustomerDetails方法里的更新代码:
// 原来的代码 // PrimeFaces.current().ajax().update("customerForm:messages", "form:basicDT"); // 修改为 PrimeFaces.current().ajax().update("customerForm:msgs", "customerForm:basicDT");
4. Customer类equals方法逻辑错误
你使用==比较字符串类型的customerId,==对比的是对象内存地址,不是字符串内容,会导致行匹配、数据更新等场景出现预期外的错误。
修改equals方法:
@Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Customer)) return false; Customer other = (Customer) obj; return Objects.equals(customerId, other.customerId); // 替换原来的==比较 }
内容的提问来源于stack exchange,提问作者Domkat B Stephen
相关产品推荐
相关产品推荐

