You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 10:15:01