控件不存在';t进入Primefaces LazyDataModel加载方法

控件不存在';t进入Primefaces LazyDataModel加载方法,primefaces,datatable,lazydatamodel,Primefaces,Datatable,Lazydatamodel,在添加lazy属性之前,我能够看到datatable中的数据。在添加了lazy属性之后,datatable是空的,因为我的调试点从未达到过,它位于LazyDataModel的load方法中。换句话说,如果不调用load方法,我将在我的搜索()中看到该控件。searchResults 我只是从web服务中得到结果(它工作得很好),我已经查看了大多数链接和。我确保设置了lazy属性和setRowCount。也许有人能帮我解决这个问题。我使用的是PrimeFaces6.0、CDI、JSF2.2和Del

在添加lazy属性之前,我能够看到datatable中的数据。在添加了lazy属性之后,datatable是空的,因为我的调试点从未达到过,它位于LazyDataModel的load方法中。换句话说,如果不调用load方法,我将在我的搜索()中看到该控件。searchResults

我只是从web服务中得到结果(它工作得很好),我已经查看了大多数链接和。我确保设置了lazy属性和setRowCount。也许有人能帮我解决这个问题。我使用的是PrimeFaces6.0、CDI、JSF2.2和Deltaspike 1.7.2

这是我的JSF

    // other input form fields
    <p:panel style="border-style : none;" styleClass="panelClass">
        <h:panelGrid columns="2">
            <!-- <h:commandButton action="#{search.search}" value="Search" styleClass="button_small_white" /> -->
            <p:commandButton action="#{search.search}" ajax="true" update=":mainform:searchResultTable" value="Search" styleClass="button_small_white" />
            <h:commandButton action="#{search.clear}" value="Clear" styleClass="button_small_white" />                  
        </h:panelGrid>
    </p:panel>
    <br /><p:dataTable value="#{search.searchResults}" var="rec" 
                        rowKey="rec.numTxt"
                        paginator="true" rows="10" 
                        paginatorTemplate=" Display {RowsPerPageDropdown} Records   {FirstPageLink} 
                        {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}  "
                        rowsPerPageTemplate="10,25,50,100" 
                        paginatorPosition="top"  
                        rendered="#{not empty search.searchResults}"
                        id="searchResultTable"
                        widgetVar="searchTable" 
                        lazy="true" 
                        summary="RE Search Results are shown below">

                <p:ajax event="page" listener="#{search.search}" update=":mainform:searchResultTable"  />            
                <p:column headerText="">
                    <p:selectBooleanCheckbox value="#{rec.select}" />
                </p:column>
                ...
            </p:dataTable>  
//其他输入表单字段

...
控制器

@Named("search")
@Stateful
@GroupedConversationScoped
@ConversationGroup(SearchGrp.class)
public class ReSearchController extends BaseWebServicesSearchController<ReSearchSummary>
    implements ReGrp, ReSearchControllerLocal {


@Inject
private GroupedConversation conversation;

@Inject
private WindowContext windowContext;

private LazyDataModel<ReSearchSummary> searchResults;

...

@PostConstruct 
@Override
public void init() {
    // code for initializing my web services
    search();
}

@Override
public String search(){

    this.searchResults = new LazyDataModel<ReSearchSummary>() {

        private static final long serialVersionUID = 4168363870903585956L;

        @Override
        public List<ReSearchSummary> load(int first, int pageSize, String sortField, SortOrder sortOrder,
                Map<String, Object> filters) {

            List<ReSearchSummary> resultsList = null;

            resultsList = search(first, pageSize);

            // rowCount
            setRowCount(getResultCount());
            // I do not need sorting oor filters os did not use them

            return resultsList;
        }
    };
    searchResults.setRowCount(getResultCount());
    return "/cr-re-search.xhtml?faces-redirect=true";
}

@Override
public ArrayList<ReSearchSummary> search(int first, int pageSize){
    // this is my webservice call, this works fine if I call it indepedently
    // criteria gets the form inputs
    return doSearch(criteria.getForm(), pageSize, first);
}
...
}
@Named(“搜索”)
@有状态
@GroupedConversationScoped
@会话组(SearchGrp.class)
公共类ReSearchController扩展BaseWebServiceSearchController
执行ReGrp,ReSearchControllerLocal{
@注入
私人分组会话;
@注入
私有窗口上下文窗口上下文;
私人LazyDataModel搜索结果;
...
@施工后
@凌驾
公共void init(){
//用于初始化我的web服务的代码
搜索();
}
@凌驾
公共字符串搜索(){
this.searchResults=new LazyDataModel(){
私有静态最终长SerialVersionId=416836387090358956L;
@凌驾
公共列表加载(int first,int pageSize,String sortField,SortOrder SortOrder,
地图过滤器){
列表结果列表=空;
resultsList=搜索(第一,页面大小);
//行数
setRowCount(getResultCount());
//我不需要对oor过滤器进行排序,因为os没有使用它们
返回结果列表;
}
};
setRowCount(getResultCount());
返回“/cr research.xhtml?faces redirect=true”;
}
@凌驾
公共ArrayList搜索(int-first,int-pageSize){
//这是我的webservice调用,如果我独立调用,它可以正常工作
//条件获取表单输入
返回doSearch(criteria.getForm(),pageSize,first);
}
...
}
更新:将搜索按钮的h:commandButton转换为p:commandButton

<p:commandButton action="#{search.search}" ajax="true" update=":mainform:searchResultTable" value="Search" styleClass="button_small_white" />

并在p:dataTable中添加了p:ajax

<p:ajax event="page" listener="#{search.search}" update=":mainform:searchResultTable"  />


首先,要找到根本原因,请删除以下内容:
@Stateful@GroupedConversationScoped@ConversationGroup(SearchGrp.class)
,因为您没有使用ajax,所以请使用@SessionScoped。您的search()将重定向到(其他?)页面。奇怪的构造。。。简化并查看它是否有效(在PrimeFaces showcase中是这样)@Kukeltje我需要所有这些,这是从seam迁移的一部分,我们仍然希望保留EJB并使用它,我们正在用deltaspike对话替换seam对话,但我仍然会尝试删除它们并尝试一下。我的搜索返回到同一个页面,这是我必须删除的冗余内容。那么为什么不使用ajax来更新datatable呢?我已经编辑了代码来尝试ajax,但是控件仍然没有进入load方法。