[英]Eager ApplicationScoped managed beans constructed multiple times
我有一堆急切的 ApplicationScoped
托管bean。 其中一些通过ManagedProperty
注释注入到其他注释中,形成依赖树。 每个依赖bean在构造后操纵其父级。
但是,似乎为每次注射创建了一个新实例,从而使之前的操作无法完成。 据我了解, ApplicationScoped
bean只能创建一次。 我误解了或者为什么会这样? 是因为他们渴望吗?
这是一个例子:
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.
// ...
}
}
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
}
}
我希望在Tomcat 8 + Mojarra 2.2.0上解决这个问题。 在我的情况下,我刚从web.xml中删除了监听器声明
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
之后似乎会调用构造函数。
关于听众进入, 这个问题的BalusC回答的一部分。
在任何情况下,在web.xml中显式注册Mojarra的ConfigureListener实际上只需要解决在Mojarra的TLD文件中找不到侦听器的旧错误服务器,例如GlassFish v3和Jetty。 当部署到体面的服务器时,整个条目是不必要的。
我对Mojarra 2.0.x也有同样的问题。 我想这个问题与多线程JSF启动有关。 尝试通过com.sun.faces.enableMultiThreadedStartup参数禁用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.