Java 急切的应用程序多次构造受管理的bean

Java 急切的应用程序多次构造受管理的bean,java,jsf,jakarta-ee,jsf-2,managed-bean,Java,Jsf,Jakarta Ee,Jsf 2,Managed Bean,我有一堆急切的应用程序处理托管bean。其中一些通过ManagedProperty注释注入到另一些中,形成依赖关系树。每个依赖bean在构造后操纵其父bean 但是,似乎每次注入都会创建一个新实例,从而使以前的操作撤消。据我所知,ApplicationScopedbean应该只创建一次。我是否误解了或为什么会发生这种情况?是因为他们渴望吗 以下是一个例子: ParentBean.java Child1Bean.java Child2Bean.java 我对Mojarra 2.0.x也有同样的问题

我有一堆急切的
应用程序处理
托管bean。其中一些通过
ManagedProperty
注释注入到另一些中,形成依赖关系树。每个依赖bean在构造后操纵其父bean

但是,似乎每次注入都会创建一个新实例,从而使以前的操作撤消。据我所知,
ApplicationScoped
bean应该只创建一次。我是否误解了或为什么会发生这种情况?是因为他们渴望吗

以下是一个例子:

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

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

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

com.sun.faces.config.ConfigureListener
构造函数似乎在之后被调用一次

关于听者输入,有一部分是BalusC对问题的回答

在任何情况下,在web.xml中显式注册Mojarra的ConfigureListener实际上只是为了解决诸如GlassFish v3和Jetty等旧的有缺陷的服务器,这些服务器在Mojarra的TLD文件中找不到侦听器。当部署到一个合适的服务器上时,整个条目是不必要的


你能给出一个代码示例来说明你是如何做到这一点的吗?不要认为我会做任何更改,但请尝试
@ManagedProperty(value=“#{parentBean}”)
,表达式是等效的,但我试过了。没有变化。我没有注射,Tomcat7.0.53/Mojarra 2.2.6也有同样的问题。我的应用程序范围渴望bean构造了3次。非渴望的只有一次。谢谢,但没有效果。我的应用程序正在Mojarra 2.1.6上运行。
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
    }
}
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
    }
}
<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>