取消选择单个复选框时 Primefaces selectCheckboxMenu 行为不稳定

Primefaces selectCheckboxMenu erratic behavior when deselecting individual checkboxes

在基于 jsf 2.1 和 Primefaces 6.1.5 的应用程序中,我很难实现 <p:selectCheckboxMenu

我根据这里的说明简化了代码How to create a Minimal, Complete, and Verifiable example 我的代码现在看起来与 Primefaces Showcase 中的代码非常相似。 Primefaces Showcase

经过大量分析,我可以更好地描述 'erratic'。取消选择一个项目时,它后面的项目会受到影响。最后一项完全不受影响。第一项永远无法取消选择。这似乎是使用索引的错误。

任何人都可以确认这一点并提出解决方法吗?

这是 xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui">

    <h:form id="form">
        <p:panel>
            <p:selectCheckboxMenu id="testSCM"
                                  value="#{myForm.testList}"
                                  multiple="true"
                                  label="Choose item..."
                                  updateLabel="true">
                <f:selectItems var="s"  value="#{myForm.testItems}" itemLabel="#{s}" />
            </p:selectCheckboxMenu>
        </p:panel>

        <p:commandButton value="Submit" update="displayItems" oncomplete="PF('itemDialog').show()" style="margin-top:10px;" />

        <p:dialog header="Selected Items" modal="true" showEffect="fade" hideEffect="fade" widgetVar="itemDialog" width="250">
            <p:outputPanel id="displayItems">
                <p:dataList value="#{myForm.statusList}" var="item" emptyMessage="No items selected">
                    <f:facet name="header">
                        Status
                    </f:facet>
                    #{item}
                </p:dataList>
            </p:outputPanel>
        </p:dialog>
    </h:form>
</ui:composition>

这是表格:

@Named("myForm")
@SessionScoped
public class MyForm implements Serializable {

    private String[] testList;
    private List<String> testItems;

    public String[] getTestList() {
        return testList;
    }

    public void setTestList(String[] testList) {
        this.testList = testList;
    }

    public List<String> getTestItems() {
        return testItems;
    }

    public void setTestItems(List<String> testItems) {
        this.testItems = testItems;
    }

    public void reset() {
        testItems = new ArrayList<>();
        testItems.add("Item1");
        testItems.add("Item2");
        testItems.add("Item3");
        testItems.add("Item4");
        testItems.add("Item5");
        testItems.add("Item6");
    }
}

问题是由 Primefaces 版本 6.1.5 中的错误引起的。当降级到 6.0 版或升级到 6.1.8 版时,代码工作正常,这是我选择做的。

问题描述见Primefaces issue tracker on github