0

我遵循了 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 时我做错了什么

4

2 回答 2

0

所以感谢 Balusc,我只是在我的函数中用 new 调用它。我将 value="#{taxonomiaController.lazyListFichas}" 从我的数据表更改为 value="#{fichaLazyList}",在我的脑海中,我没有将 FichaLazyList 视为 bean,它是另一个类,无论如何解决了问题,我添加了@ManagedBean 和 @RequestScoped 到 FichaLazyList 我猜它也可能是 @viewScoped。在我看来,应该是 RequestedScoped,如果不是,我会解决这个问题。我还将它添加到 init 函数中,这是使用匿名类的另一种方法:

lazyListFichas = new LazyDataModel() { @Override 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());
于 2013-05-31T16:43:08.740 回答
-1

我认为问题不在于您的托管 bean,问题在于您的模型 EJB 或 Hibernate,因为 fichas 的值为 null 所以 fichaDao.encontrarPagina(first, pageSize) 返回 null 检查 fichaDao 的代码和要连接的休眠设置数据库。

于 2013-05-30T20:35:03.003 回答