我有一堆eager ApplicationScoped
托管豆。其中一些是通过注射到其他体内的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
}
}
我希望在 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 实际上只需要解决旧有问题的服务器(例如 GlassFish v3 和 Jetty),这些服务器无法在 Mojarra 的 TLD 文件中找到侦听器。当部署到一个像样的服务器时,整个条目是不必要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)