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

PrimeFaces PickList移除事件getItems()返回空问题求解

PrimeFaces PickList 移除操作获取不到TransferEvent items的解决方法

问题根因

你遇到的问题由两个常见错误导致:

  1. 后端监听方法存在低级变量名错误:isRemove()分支的for循环定义的循环变量是object,但循环内部操作时误用了add分支的局部变量item,本身就会导致逻辑执行异常。
  2. PickList绑定值的初始化逻辑不符合组件要求:PrimeFaces PickList组件要求绑定的DualListModel必须基于全量的源、目标列表数据构造,若在回发时复用被修改过的旧DualListModel实例,或者转换器无法唯一匹配实体对象,就会导致组件无法识别目标侧选中的待移除项,最终返回空的items集合。

修复步骤

  • 首先修正remove分支的循环变量错误,修正后的代码片段如下:
public void onTransfer(TransferEvent event) {
    if (event.isAdd()) {
        for (Object item : event.getItems()) {
            Service service = (Service) item;
            notDuplicatedServices.remove(service);
            serviceNamesTarget.add(service);
        }
    } else if (event.isRemove()) {
        log.info(event.getItems().size());
        for (Object object : event.getItems()) {
            Service service = (Service) object;
            notDuplicatedServices.add(service);
            serviceNamesTarget.remove(service);
        }
    }
}
  • 调整PickList绑定值serviceNames的get/set逻辑,不要长期缓存DualListModel实例,每次getter调用时基于当前持有的源列表、目标列表构造全新的DualListModel返回,setter接收组件回传的model时同步更新两个本地列表即可,参考实现:
// 持有两个独立的列表存储源、目标数据,不要直接持有DualListModel作为持久状态
private List<Service> notDuplicatedServices; // 可用服务列表
private List<Service> serviceNamesTarget; // 已分配服务列表

public DualListModel<Service> getServiceNames() {
    // 每次getter调用时构造新的DualListModel实例
    return new DualListModel<>(notDuplicatedServices, serviceNamesTarget);
}

public void setServiceNames(DualListModel<Service> serviceNames) {
    // 回发时同步更新两个本地列表
    this.notDuplicatedServices = new ArrayList<>(serviceNames.getSource());
    this.serviceNamesTarget = new ArrayList<>(serviceNames.getTarget());
}
  • 检查serviceConverter的实现逻辑,确保getAsString返回的字符串可以唯一标识一个Service实体(比如用服务主键ID),getAsObject可以根据该字符串准确获取到对应的Service实例,避免因转换器匹配失败导致组件无法识别选中项。

完成以上修正后,移除服务时event.getItems()即可正常返回所有被选中的待移除项。

内容的提问来源于stack exchange,提问作者Mortadha BOUALLAGUI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:18:09