Я обновил свое приложение с Primefaces 3.4.2 до Primefaces 5.1 и JSF 2.1.10 до версии 2.1.29. Моя логика ниже используется для работы со старыми банками, но после обновления оно показывает неожиданное поведение.
У меня есть commandLink, который загружает диалоговое окно onclick () event.Dialog box содержит динамическую таблицу данных, которая будет заполнена preLoadMethod в bean.
Перед обновлением до новых jar-файлов по щелчку commandLink диалоговое окно отображает результаты поиска в динамической таблице правильно, без проблем. После обновления до новых jar-файлов в диалоговом окне отображается «Записи не найдены». сообщение вместо результатов поиска при нажатии на commandLink. Я проверил, что данные доступны на стороне клиента, введя какое-то значение в поле фильтра, которое показывает отфильтрованные данные, и после удаления отфильтрованного значения я могу увидеть полные результаты поиска. диалоговое окно, а затем еще раз щелкните ссылку на команду. Я вижу результаты поиска в таблице данных, а затем через несколько секунд содержимое будет обновлено, и появится сообщение «Записи не найдены».
1)xhtml code....
<html>
....
....
<h:body>
....
<h:form>
...
<h:panelGroup id="panelGroupId">
<p:commandLink id="searchId" onclick="dialogVar.show()" process="@this" global="false"
action="#{bean.preLoadMethod}" update="@none">
<f:setPropertyActionListener target="#{bean.selectedSearchId}" value="7" />
<f:setPropertyActionListener target="#{bean.componentId}" value="ipComponent:searchForm_7:resultsTable" />
<h:graphicImage styleClass="rollover imgAligntop" style="border:0;" name="search_on.png" library="images" />
</p:commandLink>
<p:tooltip for="panelGroupId" value="Search"></p:tooltip>
</h:panelGroup>
...
</h:form>
.....
<p:dialog id="dialogId" hideEffect="fade" modal="true" widgetVar="dialogVar" resizable="false" appendTo="@(body)"
position="230,120" draggable="true" minimizable="false" maximizable="false" header="Dialog">
<custom:searchComponent id="ipComponent" dialogName="searchDialog" searchId="7">
</custom:searchComponent>
<p:ajax event="close" listener="#{bean.closeDialog}" global="false"/>
</p:dialog>
...
</h:body>
</html>
2)Bean code
public void preLoadMethod() {
//Gets the data from database and populates the List(searchDataList,filteredResults,columns)
which will be used by datatable to populate
FacesContext facesContext = FacesContext.getCurrentInstance();
DataTable dynamicDataTable = (DataTable) facesContext.getViewRoot().findComponent(componentId+"_"+selectedSearchId);
if(dynamicDataTable != null) {
lovDataTable.setEmptyMessage("No records found.");
}
RequestContext context = RequestContext.getCurrentInstance();
String arr[] = {componentId+"_"+selectedSearchId};
Collection<String> updateFields = Arrays.asList(arr);
whereClause = "";
context.update(updateFields);
}
3)searchComponent.xhtml
<html>
....
...
<composite:interface.....
<composite:attribute name="searchId" required="true" />
</composite:interface>
<composite:implementation>
<h:form id="searchForm_#{cc.attrs.searchId}" onsubmit="return false;">
----
<p:dataTable id="resultsTable_#{cc.attrs.searchId}" var="search" paginator="true" rows="10" value="#{bean.searchDataList}"
selectionMode="single" pageLinks="5" paginatorPosition="both" rowIndexVar="rowIndexVar"
paginatorTemplate="Page {CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
paginatorAlwaysVisible="true"
filteredValue="#{bean.filteredResults}"
widgetVar="searchTable_#{cc.attrs.searchId}"
emptyMessage="Data is loading please wait...">
<p:columns id="searchColumns" value="#{bean.columns}" var="column" sortBy="#{search[column.property]}"
filterBy="#{search[column.property]}"
rendered="#{fn:length(bean.searchDataList) gt 0}"
filterMatchMode="startsWith"
>
<f:facet name="header">
#{column.header}
</f:facet>
<h:outputText value="#{search[column.property]}" id="searchText" >
</h:outputText>
</p:columns>
</p:dataTable>
----
</h:form>
---
</composite:implementation>
</html>