我遵循了 primefaces 页面的示例(http://www.primefaces.org/showcase/ui/datatableLazy.jsf),并且它有效,但是因为该示例正在将列表加载到构造函数上,所以它并不完全是延迟加载。我知道这是一个虚拟示例,所以在我的 bean 上我添加了这些行
private LazyDataModel<Ficha> lazyListFichas;
而我的初始化函数我改变了一些部分到这个
@PostConstruct
public void init() {
System.out.println("Inicializando fichas");
tienePadres=false;
fichaDM.setFicha(new Ficha());
//obtenerFichas();
//lazyListFichas = new FichaLazyList(fichaDM.getFichas);
lazyListFichas = new FichaLazyList();
}
我的 FichaLazyList 是这样的
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import ec.edu.puce.biologia.dao.FichaDao;
import ec.edu.puce.biologia.util.LazySorter;
@ViewScoped
public class FichaLazyList extends LazyDataModel <Ficha> {
private static final long serialVersionUID = 1L;
private List<Ficha> fichas=new ArrayList<Ficha>();
@EJB
private FichaDao fichaDao;
public FichaLazyList() {
}
public FichaLazyList(List<Ficha> fichas) {
this.fichas = fichas;
}
@Override
public Ficha getRowData(String rowKey) {
for(Ficha ficha : fichas) {
if(ficha.getIdFicha().equals(rowKey))
return ficha;
}
return null;
}
@Override
public Object getRowKey(Ficha ficha) {
return ficha.getIdFicha();
}
@Override
public List<Ficha> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
List<Ficha> data = new ArrayList<Ficha>();
//filter
fichas = fichaDao.encontrarPagina(first, pageSize);
if(fichas==null){
System.out.println("Lista nula");
}
for(Ficha ficha : fichas) {
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(ficha.getClass().getField(filterProperty).get(ficha));
if(filterValue == null || fieldValue.startsWith(filterValue)) {
match = true;
}
else {
match = false;
break;
}
} catch(Exception e) {
match = false;
}
}
if(match) {
data.add(ficha);
}
}
long total = fichaDao.contar();
System.out.println("xxx"+total);
//sort
if(sortField != null) {
Collections.sort(data, new LazySorter(sortField, sortOrder));
}
//rowCount
// int dataSize = data.size();
this.setRowCount((int) total);
//paginate
if(total > pageSize) {
try {
return data.subList(first, first + pageSize);
}
catch(IndexOutOfBoundsException e) {
return data.subList(first, first + ((int) total % pageSize));
}
}
else {
return data;
}
}
public List<Ficha> getFichas() {
return fichas;
}
public void setFichas(List<Ficha> fichas) {
this.fichas = fichas;
}
}
我得到这个错误,
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/catalogoBiologia].[Faces Servlet]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
at ec.edu.puce.biologia.model.FichaLazyList.load(FichaLazyList.java:55) [classes:]
第55行是这个
fichas = fichaDao.encontrarPagina(first, pageSize);
应该是视图范围还是会话范围,当我尝试注入 ejb 时我做错了什么