我有一堆渴望的ApplicationScoped管理的bean。它们中的一些通过ManagedProperty注释注入(inject)了其他对象,从而形成了依赖关系树。每个依赖的bean在构造后都会操纵其父对象。

但是,似乎为每次注入(inject)都创建了一个新实例,因此撤消了之前的操作。据我了解,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
    }
}

最佳答案

我希望已经在Tomcat 8 + Mojarra 2.2.0上解决了这个问题。
就我而言,我只是从web.xml中删除了监听器声明

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

构造函数之后似乎被调用过一次。

关于监听器输入,有一部分BalusC回答this问题。

10-06 03:35