Primary data dataTable does not update content

I have some problems updating on a lazy loaded Primesfaces data file. I am using 3.0.M4.

You have three classes, as in your filter example. I also tried the lazy loading example, but then the data was not reloaded in the controller. So I used the second example with filtering. There I get reboot events in the controller (the logger displays "Data loading"). But the table does not show new data :-(. Why?

Who can help here?

Yours faithfully!

LazyCarDataModel

package org.jboss.as.quickstarts.helloworld; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import org.primefaces.model.LazyDataModel; import org.primefaces.model.SortOrder; /** * Dummy implementation of LazyDataModel that uses a list to mimic a real datasource like a database. */ public class LazyCarDataModel extends LazyDataModel<Car> { private static final long serialVersionUID = 1L; private List<Car> datasource; public LazyCarDataModel(List<Car> datasource) { this.datasource = datasource; } @Override public Car getRowData(String rowKey) { for(Car car : datasource) { if(car.getModel().equals(rowKey)) return car; } return null; } @Override public Object getRowKey(Car car) { return car.getModel(); } @Override public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { List<Car> data = new ArrayList<Car>(); //filter for(Car car : datasource) { boolean match = true; for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { try { String filterProperty = it.next(); String filterValue = filters.get(filterProperty); String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car)); if(filterValue == null || fieldValue.startsWith(filterValue)) { match = true; } else { match = false; break; } } catch(Exception e) { match = false; } } if(match) { data.add(car); } } //sort if(sortField != null) { Collections.sort(data, new LazySorter(sortField, sortOrder)); } //rowCount int dataSize = data.size(); this.setRowCount(dataSize); //paginate if(dataSize > pageSize) { try { return data.subList(first, first + pageSize); } catch(IndexOutOfBoundsException e) { return data.subList(first, first + (dataSize % pageSize)); } } else { return data; } } } 

LazyTableBean

 package org.jboss.as.quickstarts.helloworld; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.enterprise.context.SessionScoped; import javax.inject.Named; import org.primefaces.model.LazyDataModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Named @SessionScoped public class LazyTableBean implements Serializable { private static final long serialVersionUID = 1L; private final static Logger logger = LoggerFactory.getLogger(LazyTableBean.class); private final static String[] colors; private final static String[] manufacturers; private List<Car> cars; static { colors = new String[10]; colors[0] = "Black"; colors[1] = "White"; colors[2] = "Green"; colors[3] = "Red"; colors[4] = "Blue"; colors[5] = "Orange"; colors[6] = "Silver"; colors[7] = "Yellow"; colors[8] = "Brown"; colors[9] = "Maroon"; manufacturers = new String[10]; manufacturers[0] = "Mercedes"; manufacturers[1] = "BMW"; manufacturers[2] = "Volvo"; manufacturers[3] = "Audi"; manufacturers[4] = "Renault"; manufacturers[5] = "Opel"; manufacturers[6] = "Volkswagen"; manufacturers[7] = "Chrysler"; manufacturers[8] = "Ferrari"; manufacturers[9] = "Ford"; } private LazyCarDataModel lazyModel; private Car selectedCar; public LazyTableBean() { cars = new ArrayList<Car>(); populateLazyRandomCars(cars, 100000); lazyModel = new LazyCarDataModel(cars); } public Car getSelectedCar() { return selectedCar; } public void setSelectedCar(Car selectedCar) { this.selectedCar = selectedCar; } public LazyDataModel<Car> getLazyModel() { return lazyModel; } private void populateLazyRandomCars(List<Car> list, int size) { System.out.println("Loading data"); for(int i = 0 ; i < size ; i++) { list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor())); } } private String getRandomColor() { return colors[(int) (Math.random() * 10)]; } private String getRandomManufacturer() { return manufacturers[(int) (Math.random() * 10)]; } private int getRandomYear() { return (int) (Math.random() * 50 + 1960); } private String getRandomModel() { return UUID.randomUUID().toString().substring(0, 8); } } 

And here is 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" template="template-default.xhtml"> <ui:define name="content"> <h:form> <p:dataTable var="car" value="#{lazyTableBean.lazyModel}" paginator="true" rows="10" lazy="true" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" rowsPerPageTemplate="5,10,15" selection="#{lazyTableBean.selectedCar}" selectionMode="single"> <p:ajax event="rowSelect" listener="#{lazyTableBean.onRowSelect}" update=":form:display" oncomplete="carDialog.show()" /> <p:column headerText="Model"> <h:outputText value="#{car.model}" /> </p:column> <p:column headerText="Year"> <h:outputText value="#{car.year}" /> </p:column> <p:column headerText="Manufacturer"> <h:outputText value="#{car.manufacturer}" /> </p:column> <p:column headerText="Color"> <h:outputText value="#{car.color}" /> </p:column> </p:dataTable> <p:dialog header="Car Detail" widgetVar="carDialog" resizable="false" width="200" showEffect="explode" hideEffect="explode"> <h:panelGrid id="display" columns="2" cellpadding="4"> <f:facet name="header"> <p:graphicImage value="/images/cars/#{lazyTableBean.selectedCar.manufacturer}.jpg" /> </f:facet> <h:outputText value="Model:" /> <h:outputText value="#{lazyTableBean.selectedCar.model}" /> <h:outputText value="Year:" /> <h:outputText value="#{lazyTableBean.selectedCar.year}" /> <h:outputText value="Manufacturer:" /> <h:outputText value="#{lazyTableBean.selectedCar.manufacturer}" /> <h:outputText value="Color:" /> <h:outputText value="#{lazyTableBean.selectedCar.color}" /> </h:panelGrid> </p:dialog> </h:form> </ui:define> </ui:composition> 
+4
source share
2 answers

Ok I have it. Thanks for your ideas! This led me to another idea. Even exmaples does not have an id attribute in the p: dataTable tag, I am setting this now and the table is working as expected. So,

 <p:dataTable id="dataTable" var="car"... 

helped; -).

+1
source

Try the following:
1. Give your <h:form> id. ( <h:form id="tableForm"> )
2. Change the update attribute from <p:ajax> to ( update=":tableForm" ) without: display

If this does not work. Try the following:
1. Change @Named Annotation to @ManagedBean 2. Change @SessionScoped to use javax.faces.bean.SessionScoped

These are just some of the ideas. Try it :)

+3
source

Source: https://habr.com/ru/post/1387420/


All Articles