渴望ApplicationScoped托管bean构建多次

Spo*_*omf 5 java jsf java-ee jsf-2 managed-bean

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

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

这是一个例子:

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.

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

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