ApplicationScoped Bean与postconstruct方法

时间:2012-10-24 20:26:09

标签: jsf java-ee ejb managed-bean postconstruct

我有一个应用程序范围的bean来保存我的数据库中的信息。在实例化之后它应该获取数据,所以我用@PostConstruct注释了该方法。一旦我请求引用此bean的jsf页面,服务器日志就会爆炸!我认为它以某种方式递归并且我得到的唯一堆栈跟踪是在repBean.acceptVisitor(访问者)期间发生系统异常;方法。服务器日志然后获得几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();
   }
}

1 个答案:

答案 0 :(得分:2)

这不是正常行为。

以下其中一行

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

是间接评估EL表达式#{indexBean},这反过来导致bean再次被构造,因为它尚未投入使用。它只会在#{indexBean}完成后投入使用(因此可以作为具体的@PostConstruct使用)。这一切都会导致无限循环。

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