我遵循了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);
它应该是viewcope还是会话范围,当我尝试注入ejb时我做错了什么
答案 0 :(得分:0)
非常感谢Balusc,我只是在我的函数中使用new来调用它。我将value =“#{taxonomiaController.lazyListFichas}”从我的数据表更改为value =“#{fichaLazyList}”,在我脑海中,我没有看到FichaLazyList作为一个bean,它是另一个类,无论如何解决了这个问题,我添加了@ManagedBean和@RequestScoped到FichaLazyList我想它也可能是@viewScoped。在我看来应该是RequestedScoped,如果不是我会解决这个问题。 我还将此添加到init函数中,这是使用anoymous类的另一种方法:
lazyListFichas = new LazyDataModel(){ @覆盖 public List load(int first,int pageSize,String sortField,SortOrder sortOrder,Map filters){
List<Ficha> lazyFicha = new ArrayList<Ficha>();
lazyFicha = servicioFicha.obtenerTodos(first, pageSize);
// populateLazyRandomCars(lazyFicha, pageSize);
return lazyFicha;
}
};
/**
* In a real application, this number should be resolved by a projection
* query
*/
lazyListFichas.setRowCount((int) servicioFicha.contarRegistrosTotal());
答案 1 :(得分:-1)
我认为问题不在您的托管bean中,问题出在您的模型EJB或Hibernate中 因为fichas的值为null所以fichaDao.encontrarPagina(first,pageSize)返回null检查fichaDao的代码和你的hibernate设置以连接到数据库。