Olá Pessoal!
Eu consegui renderizar uma datatable com lazy mas agora não consigo usar o filtro para pesquisar os objetos,meu exemplo está assim.
Meu bean:
@ViewScoped
public class Transacao_DocumentoBean {
private Transacao_Documento transacao_documento = new Transacao_Documento();
private Transacao_Documento transacao_documentoSelecionada = new Transacao_Documento();
private List<Transacao_Documento> lista;
private Integer id_transacao;
private Integer id_camp_adic;
private Integer id_doc;
private UploadedFile arquivo;
private StreamedContent streamedContent;
private LazyDataModel<Transacao_Documento> lazymodel;
@PostConstruct
public void init() {
lazymodel = new LazyTransacao_Documento(listar());
}
Minha LazyDataModel:
package br.com.OPT_WEB_002.transacao_documento;
import java.io.ObjectInputStream.GetField;
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;
public class LazyTransacao_Documento extends LazyDataModel<Transacao_Documento> {
private static final long serialVersionUID = 1L;
private List<Transacao_Documento> listaTransDoc;
public LazyTransacao_Documento(List<Transacao_Documento> listaTransDoc) {
this.listaTransDoc = listaTransDoc;
}
public LazyTransacao_Documento() {}
public Transacao_Documento getRowData(String rowKey) {
for(Transacao_Documento transacao_Documento : listaTransDoc) {
if(transacao_Documento.getId_transacao_doc() == Integer.parseInt(rowKey))
return transacao_Documento;
}
return null;
}
@Override
public Object getRowKey(Transacao_Documento transacao_Documento) {
return transacao_Documento.getId_transacao_doc();
}
@Override
public List<Transacao_Documento> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
List<Transacao_Documento> data = new ArrayList<Transacao_Documento>();
//filter
for(Transacao_Documento transacao_Documento: listaTransDoc) {
boolean match = true;
if (filters != null) {
for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
try {
String filterProperty = it.next();
Object filterValue = filters.get(filterProperty);
String fieldValue = String.valueOf(transacao_Documento.getClass().getField(filterProperty).get(transacao_Documento));
if(filterValue == null || fieldValue.startsWith(filterValue.toString())) {
match = true;
}
else {
match = false;
break;
}
} catch(Exception e) {
match = false;
}
}
}
if(match) {
data.add(transacao_Documento);
}
}
//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;
}
}
public List<Transacao_Documento> getListaTransDoc() {
return listaTransDoc;
}
public void setListaTransDoc(List<Transacao_Documento> listaTransDoc) {
this.listaTransDoc = listaTransDoc;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
Eu estudei um pouco o método que carrega a datatable com lazy mas não entendi a parte em que o filtro funciona,um dos erros que aparecem durante é o noSuchFiledException.Então pesquisei para saber o porque e encontrei respostas dizendo que os campos que estão sendo carregados com filtro não podem ser private.Alguém pode me ajudar a desvendar este erro ou usar um outro tipo de filtro com lazy?
Agradeço desde já!