当前位置: 首页 > 知识库问答 >
问题:

primefaces惰性数据加载和hibernate,java。lang.NullPointerException错误

施誉
2023-03-14

我以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);

如果是viewscope还是session scope,当我尝试注入ejb时,我做错了什么

共有2个答案

申高峰
2023-03-14

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

穆景辉
2023-03-14

谢谢Balusc,我只是在我的函数中用new调用它。我将value=“#{taxonomoniacontroller.lazyListFichas}”从我的数据表更改为value=“#{fichaLazyList}”,在我的脑海中,我没有将fichaLazyList视为bean,它是另一个类,无论如何解决了这个问题,我向fichaLazyList添加了@ManagedBean和@RequestScoped,我想它也可能是@viewScoped。在我看来,应该对其进行requestedscope处理,否则我会解决这个问题。我还将其添加到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());
 类似资料:
  • 我有一个由Hibernate加载的ORM实体,当我需要时,会加载某些关联。该实体通过MQ传输到客户机应用程序(客户机是.NET,所以我使用MessagePack来序列化/反序列化),当实体被MsgPack序列化时,它试图访问惰性加载的关联,但失败了,因为会话已经关闭。即使它没有失败,我也不希望它在某些情况下加载关联。 是否有一种方法告诉hibernate使用空值而不是某些查询结果的代理来填充惰性关

  • 我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。 为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。 到目前为止我所做的... 这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。 我尝试从实体中删除接口和字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得消息,并且默认情况下返回到急切加载。 我是不是

  • 这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept

  • 我试图在primefaces数据表设置中实现延迟加载。目前,在没有延迟加载实现的情况下,这是可行的,但是在实现延迟加载后,我在datatable中没有得到任何数据。但是,我可以在我的LoadData方法中打印我的列表,以验证数据是否正在加载到我的列表中,但一旦返回我的LazyModel并尝试加载datatable,似乎就会出现问题。这可能只是我忽略的一些简单的事情。非常感谢您的帮助! 这是我的屏幕

  • 那么,如何惰性加载一个单例,同时防止它受到这种攻击呢?(我知道“enum”模式,但有些人认为它实际上是一种黑客攻击。查看关于这个公认答案的评论:这个单例是否同时抵抗序列化和反射攻击?顺便说一句,我的问题不同)。 编辑:我认为在DCL的情况下可以通过使用静态计数器字段、基于类的同步构造函数并将“this”分配给静态成员来防止它。但是,不知道如何防止它的情况下持有者成语。

  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请