渴望ApplicationScoped托管bean构建多次

时间:2012-10-22 08:09:12

标签: java jsf java-ee jsf-2 managed-bean

我有一堆渴望 ApplicationScoped托管bean。其中一些通过ManagedProperty注释注入其他注释,形成依赖树。每个依赖bean在构造后操纵其父级。

然而,似乎为每次注射创建了一个新实例,从而使先前的操作无法完成。据我了解,ApplicationScoped bean应该只创建一次。我误解了或者为什么会这样?是因为他们渴望吗?

以下是一个例子:

ParentBean.java

package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean(eager = true)
@ApplicationScoped
public class ParentBean
{
    static int initCount = 0;

    // ...

    @PostConstruct
    public void init()
    {
        ++initCount; // Will end up being between 1 and 3. Expected always 1.

        // ...
    }
}

Child1Bean.java

package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child1Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}

Child2Bean.java

package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child2Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}

2 个答案:

答案 0 :(得分:1)

我希望在Tomcat 8 + Mojarra 2.2.0上解决这个问题。 在我的例子中,我刚从web.xml中删除了监听器声明

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

之后似乎会调用构造函数。

关于听众参赛,BalusC的部分回答是this问题。

  

在任何情况下,在web.xml中显式注册Mojarra的ConfigureListener实际上只需要解决在Mojarra的TLD文件中找不到监听器的老式错误服务器,例如GlassFish v3和Jetty。 。当部署到一个体面的服务器时,整个条目是不必要的。

答案 1 :(得分:0)

我对Mojarra 2.0.x有同样的问题。我想这个问题与多线程JSF启动有关。尝试通过com.sun.faces.enableMultiThreadedStartup参数禁用它。