PrimeFaces 5.1 p:datatable 过滤器被更新数据表破坏

PrimeFaces 5.1 p:datatable filter is destroyed by update datatable

我正在将我的 Web 应用程序更新到 PF5.1(之前是 PF4.0)

<p:dataTable> 组件的简单更新现在完全破坏了我的数据表 FILTER。

update=":#{p:component('tbl_queue')}"

由于新的 PF5.1 版本,我不得不更改我的列过滤器,所以我修改了我的过滤器:

<f:facet name="filter"  >
    <p:selectOneMenu ... >
        <f:selectItem ... />
        <f:selectItems ... />
    </p:selectOneMenu>
</f:facet>

旧的过滤器版本是:

<p:column id="..." 
    filterBy=...
    filterOptions="..."
    filterMatchMode="exact"
>
...
</p:column>

编辑:我的要求很简单,就是通过选择对过滤后的数据表进行删除(并使过滤器保持活动状态)。 PF4.0 可以,PF5 好像不行。

像那样:

第 1 步:过滤数据表

第 2 步:通过单击删除一行 'Envoyer' = 删除 (J91GT N9 03:17:00)

它在 PF4 上运行良好,但我找不到在 PF5 上执行相同操作的解决方案。 编辑 2:

  <p:dataTable id="tbl_queue" var="c"
    value="#{queueModificationController.cartQueue}" 
    widgetVar="queueTable"
    filteredValue="#{queueModificationController.filteredCartQueue}"
    rowKey = "#{c.id}"
>
    <p:column 
        id="Bumper_column" 
        filterBy="#{c.name_bumper}"
        headerText="Bumper"
        filterMatchMode="exact"
    >
     <f:facet name="filter" >
        <p:selectOneMenu onchange="PF('queueTable').filter()" id="selectFilterBumper" >
            <f:selectItem itemLabel="Aucun" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{queueModificationController.nameBumperOptionsString}" />
        </p:selectOneMenu>
    </f:facet>
                <h:outputText value="#{c.name_bumper}" />
    </p:column>
    <p:column>
        //...
    </p:column>
        //...
        //...

    <p:column id="validation_column" 
    headerText="Validation">
        <p:commandButton
            action="#{productionQueue.updateAfterSending()}"
            value="Validation"
            update=":#{p:component('tbl_queue')}"
            <f:setPropertyActionListener value="#{c}"
                target="#{productionQueue.selectedCart}" />
        </p:commandButton>
</p:column>
</p:dataTable>

--

@ManagedBean(name = "productionQueue")
@SessionScoped
private ArrayList<CartInQueueConsult> cartQueue; //filled by Database in bean initialisation
private ArrayList<CartInQueueConsult> filteredCartQueue = new ArrayList<CartInQueueConsult>(cartQueue);

        public void updateAfterSending()
        {
            ... (remove in database)
            filteredCartQueue.remove(selectedCart);
            cartQueue.remove(selectedCart);
        }

编辑:MCVE 错误示例:

错误: - 1:过滤器不工作(奇怪的是因为我所有的过滤器都在无 MVCE 示例中正常工作 - 2:当您使用按钮 "Remove" 删除一行时,过滤器被破坏(我最初的问题)

import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;


@ManagedBean(name = "testController")
@ViewScoped
public class TestController implements Serializable
{
    private ArrayList<String> cartQueue; 

    private String selectedCart;

    private ArrayList<String> filteredCartQueue;

    private SelectItem nameBumperOptionsString[] = {new SelectItem(1,"1"),new SelectItem(2,"2"),new SelectItem(3,"3"),new SelectItem(4,"4"),new SelectItem(5,"5")};

    @PostConstruct
    public void initialize()
    {
        cartQueue = new ArrayList<String>();
        cartQueue.add("1");
        cartQueue.add("2");
        cartQueue.add("3");
        cartQueue.add("4");
        cartQueue.add("5");
        cartQueue.add("6");
        filteredCartQueue = cartQueue;
    }

    public void remove()
    {
        try
        {
            filteredCartQueue.remove(selectedCart);
            cartQueue.remove(selectedCart);
        }
        catch (Exception ex)
        {
            System.out.println("EXCEPTION : "+ ex.getMessage());
        }
    }

    public ArrayList<String> getFilteredCartQueue() {
        return filteredCartQueue;
    }

    public void setFilteredCartQueue(ArrayList<String> filteredCartQueue) {
        this.filteredCartQueue = filteredCartQueue;
    }

    public SelectItem[] getNameBumperOptionsString() {
        return nameBumperOptionsString;
    }

    public void setNameBumperOptionsString(SelectItem nameBumperOptionsString[]) {
        this.nameBumperOptionsString = nameBumperOptionsString;
    }

    public ArrayList<String> getCartQueue() {
        return cartQueue;
    }

    public void setCartQueue(ArrayList<String> cartQueue) {
        this.cartQueue = cartQueue;
    }

    public String getSelectedCart() {
        return selectedCart;
    }

    public void setSelectedCart(String selectedCart) {
        this.selectedCart = selectedCart;
    }
}

_

   <p:dataTable 
    id="test_queue" var="c"
    value="#{testController.cartQueue}" widgetVar="testTable"
    emptyMessage="Pas de file d'attente" 
    filteredValue="#{testController.filteredCartQueue}"
    paginator="true" 
    currentPageReportTemplate="Nb Rows : {totalRecords}"
    paginatorTemplate="{CurrentPageReport}" 
    >
        <p:column id="number_column" 
        filterBy="#{c}"
        headerText="Number"
        filterMatchMode="exact"
        >
       <f:facet name="filter"  >
            <p:selectOneMenu onchange="PF('testTable').filter()" >
                <f:selectItem itemLabel="Nothing" itemValue="#{null}" noSelectionOption="true" />
                <f:selectItems value="#{testController.nameBumperOptionsString}" />
            </p:selectOneMenu>
        </f:facet>
        <center>
            <h:outputText value="#{c}" />
        </center>
    </p:column>
    <p:column headerText="Remove">
        <center>
            <p:commandButton
                action="#{testController.remove()}"
                value="Remove"
                update="test_queue" >

                <f:setPropertyActionListener value="#{c}" target="#{testController.selectedCart}" />

            </p:commandButton>
        </center>
    </p:column>
</p:dataTable>

--

编辑 3:库:

你的代码看起来不错,对我来说也很好用。我无法重现您的问题,因此无法查明真正的根本原因。

您的具体问题很可能是由于具有一堆 servletcontainer 特定库 (never do that!) 的脏运行时类路径和严重过时的 JSF 实现(超过 5 年)引起的。事实上,当您清理运行时类路径并升级 JSF 实现时,它对您来说也能正常工作。