1

我有一个应用程序范围的 bean 来保存我的数据库中的信息。在实例化之后它应该获取数据,所以我用@PostConstruct 注释了这个方法。一旦我请求引用此 bean 的 jsf 页面,服务器日志就会爆炸!我认为它以某种方式递归,我得到的唯一堆栈跟踪是在 repBean.acceptVisitor(Visitor); 期间发生了系统异常;方法。然后服务器日志会变大几 GB,我必须手动删除它才能获得可用磁盘空间。如果我删除 @PostConstruct 注释,则没有例外。从另一个 bean 调用 update() 方法后,repositoryContent 变量会正确更新并包含信息。唯一的问题是我的 jsf 页面由于某种奇怪的原因没有显示内容。

@ManagedBean(eager=true)
@ApplicationScoped
public class IndexBean implements Serializable {

    private ArrayList<ViewFolder> repositoryContent;

    @EJB
    RepositoryService repBean;

    @PostConstruct
    public void update() {
       RepositoryVisitor Visitor = new RepositoryVisitor();
       repBean.acceptVisitor(Visitor);
       repositoryContent = Visitor.getList();
   }
}
4

1 回答 1

2

这不是正常行为。

以下行之一

   RepositoryVisitor Visitor = new RepositoryVisitor();
   repBean.acceptVisitor(Visitor);
   repositoryContent = Visitor.getList();

正在间接评估 EL 表达式#{indexBean},这反过来又会导致 bean 再次被构造,因为它还没有投入使用。它只会在完成后投入使用(因此可以作为混凝土使用#{indexBean}@PostConstruct。这一切都会导致无限循环。

您可能需要进行一些重构,或者将应用程序范围的 bean 实例本身传递给方法调用,以便可以直接使用它,而不是被 EL 表达式引用。

于 2012-10-24T21:17:13.567 回答