Spring 升级后,与搜索命令按钮一起使用的全局过滤器不会更新数据表

Global filter used with search commandbutton doesn't update datatable after Spring upgrade

我在使用 commandButton 更新数据表时遇到了一些问题。

我检查过:

Primefaces - update datatable with commandButton doesn't work

但我看不出问题所在:

我使用 commandButton onclick 来搜索 globalFilter。延迟加载没问题,但过滤器仅在我按下搜索按钮时才起作用,然后按下另一个更新按钮来更新数据表。

搜索按钮过滤器 onclick。 更新按钮将 onclick 重定向到 getPaginator().setPage(0),显示更新数据表。这是我看到更新数据表的唯一方法

我尝试将 comandButton 和 actionListener 中的 form:datatable 更新为 bean.resetDatable() 但没有成功。

我只需要按下搜索按钮并在一个按钮中同时更新数据表。

<h:form id="myDataForm">
    <p:dataTable id="MyData" rowStatePreserved="true" 
                 var="varMyData" 
                 value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"                                            
                 widgetVar="wMyData" 
                 rowKey="#{MyData.id}" 
                 paginator="true" paginatorPosition="bottom" rows="10"                                             
                 paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"                                 
                 emptyMessage="No data" >


        <f:facet name="header">
            <p:outputPanel>
                <h:outputText value="Search: " />                

                <p:inputText id="globalFilter" onkeypress="PF('wMyData').filter();" />

                <p:commandButton  value="Search" class="ui-button" icon="fa fa-search"  onclick="PF('wMyData').filter();"                                  
                                  update=":myDataForm:MyData" actionListener="#{MyData.resetDatatable()}"/>                                        
                <p:commandButton value="Update" onclick="VarMyData.getPaginator().setPage(0);"/>                            
            </p:outputPanel>                    
        </f:facet>                       
        <p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"  
                  filterStyle="display:none" filterBy="#{varMyData.idNumber}"  filterMatchMode="exact" >
            <h:outputText value="#{varMyData.idNumber}" />
       </p:column>
     </datatable>
</form>

我尝试用 lazydatamodel 重置为 null 和 PrimeFaces.current(),但没有任何效果。

myDataView.java




    public MyDataLazyDataModel getMyDataLazyDataModel() {

        if (myDataLazyDataModel == null) {
            myDataLazyDataModel= new MyDataLazyDataModel(getListAll());
        }
        return myDataLazyDataModel;
    }

    public void setMyDataLazyDataModelT(MyDataLazyDataModel myDataLazyDataModel) {
        this.myDataLazyDataModel = myDataLazyDataModel;
    }



 public String resetDatatable() {

   //option1: 
    myDataLazyDataModel = null;        

  //option2
    DataTable dataTable = (DataTable)      FacesContext.getCurrentInstance().getViewRoot().findComponent("myDataForm:myData");
    PrimeFaces.current().ajax().update("myDataForm:myData");
    if (!dataTable.getFilters().isEmpty()) {
        dataTable.reset();
        PrimeFaces.current().ajax().update("myDataForm:MyData");

    }

谢谢。

我检查了控制台,问题与 Spring 3 到 Spring 4 升级和 ajax "gives 403 Forbidden" 没有提交 crsf 令牌有关。

提交crsf令牌后: https://www.baeldung.com/spring-security-csrf

 <h:head>
.....
<meta name="_csrf" content="#{_csrf.token}"/>
<meta name="_csrf_header" content="#{_csrf.headerName}"/>
....
</h:head>

我创建了一个全局过滤器,现在我可以在按搜索按钮或回车键后进行过滤, 并且更新了数据表。

<h:form id="myDataForm">
    <p:dataTable id="MyData" rowStatePreserved="true" 
                 var="varMyData" 
                 value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"                                            
                 widgetVar="wMyData" 
                 rowKey="#{MyData.id}" 
                 paginator="true" paginatorPosition="bottom" rows="10"                                             
                 paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"                                 
                 emptyMessage="No data" >


        <f:facet name="header">
            <p:outputPanel>
                <h:outputText value="Search: " />                
                <p:inputText id="globalFilter" onkeypress="if (event.keyCode === 13)  {PF('wMyData').filter(); return false;}"                                               
            placeholder="Enter data and press enter or search button"/>                                    
               <p:commandButton  class="ui-button" icon="fa fa-search"  onclick="PF('wMyData').filter() " update="growl"/>
            </p:outputPanel>                    
        </f:facet>                       
        <p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"  
                  filterStyle="display:none" filterBy="#{varMyData.idNumber}"  filterMatchMode="exact" >
            <h:outputText value="#{varMyData.idNumber}" />
       </p:column>
     </datatable>
</h:form>