【发布时间】: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 等),所以我不确定这与我的评论有什么关系。新添加的代码只会增加更多的混乱。这是一个完全不同的类,与堆栈跟踪中显示的问题不匹配。请从上到下重新阅读您的问题并相应地修复/澄清它。不要添加越来越多的问题,而是改进最初的问题。您有义务从问题中删除不相关的部分。
-
您如何管理
FichaLazyListbean?到目前为止,您似乎正在通过new FichaLazyList()手动构建它。显然,@EJB将不起作用,因为您在手动构建后没有手动设置它。@EJB注入仅适用于托管 bean,否则您必须手动从 JNDI 获取 EJB 实例并将其设置为实例变量。您的FichaLazyList必须以某种方式成为托管 bean 才能使@EJB工作。 -
我是个白痴,我看到了我遇到的错误。
标签: java hibernate jsf-2 primefaces