primefaces延迟数据加载和hibernate,java.lang.NullPointerException错误

时间:2013-05-30 17:39:15

标签: java hibernate jsf-2 primefaces

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

2 个答案:

答案 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设置以连接到数据库。