【问题标题】:primefaces lazy data loading and hibernate, java.lang.NullPointerException errorprimefaces 延迟数据加载和休眠,java.lang.NullPointerException 错误
【发布时间】:2013-05-26 09:48:54
【问题描述】:

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

【问题讨论】:

  • 你是如何管理你的豆子的?没有@ManagedBean@Named 之类的。您是使用 new 运算符手动构建它还是什么?或者您是否使用像 Spring 这样的第三方和 EJB 不兼容的框架来管理它?
  • 我只是在使用hibernate,使用persistence.xml配置,使用jboss,我的jboss有PersistenceUinit和一个数据源。我的 TaxonomiaController 是 @ManagedBean。我刚刚添加了代码。
  • Hibernate 是一个 ORM 框架,而不是一个 bean 管理框架(如 JSF、CDI、Seam、Spring 等),所以我不确定这与我的评论有什么关系。新添加的代码只会增加更多的混乱。这是一个完全不同的类,与堆栈跟踪中显示的问题不匹配。请从上到下重新阅读您的问题并相应地修复/澄清它。不要添加越来越多的问题,而是改进最初的问题。您有义务从问题中删除不相关的部分。
  • 您如何管理FichaLazyList bean?到目前为止,您似乎正在通过new FichaLazyList() 手动构建它。显然,@EJB 将不起作用,因为您在手动构建后没有手动设置它。 @EJB 注入仅适用于托管 bean,否则您必须手动从 JNDI 获取 EJB 实例并将其设置为实例变量。您的 FichaLazyList 必须以某种方式成为托管 bean 才能使 @EJB 工作。
  • 我是个白痴,我看到了我遇到的错误。

标签: java hibernate jsf-2 primefaces


【解决方案1】:

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

【讨论】:

  • 不应该像@requestscope,我的设置是正确的,我正在做许多其他的CRUD操作并且它们工作,这是我唯一的问题。在我使用转换器发生这种情况之前,我使用了 requestescope 并且它起作用了。我的一个朋友告诉我使用 Statefull 或 Stateless。
  • 目前提供的信息清楚地证实了fichaDao 本身就是null。换句话说,@EJB 根本没有完成它的工作。换句话说,bean 实例的创建方式没有考虑@EJB 注入。例如,当它使用new 手动实例化或由例如管理时Spring 而不是 JSF 本身。
【解决方案2】:

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

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());

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2016-08-07
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多