Managed Bean未在@ApplicationScoped和eager = true中实例化

时间:2016-06-22 10:30:58

标签: jsf el managed-bean eager-loading

我有以下A Sum_B Sum_C Count aaa 3 5 2 bbb 50 20 2 课程:

UserView

然后我有另一个类@ManagedBean(name="usersView", eager=true) @ApplicationScoped public class UserView { ... public void setUsers(...) { ... } } 尝试访问这个bean,然后调用此方法,如下所示:

UserService

我的问题是,UserView usersView = (UserView) FacesContext.getCurrentInstance().getExternalContext().getSessionMap("usersView"); usersView.setUsers(...) 是否继续返回null,因此无法调用该方法。

我的最终目标是在usersView PrimeFaces中使用此数据,如下所示:

datatable

我也尝试将范围更改为<p:dataTable var="user" value="#{usersView.users}" ...> ,但它仍为空,我无法弄清楚原因。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

getExternalContext().getXxxMap().get("beanName")方法如果尚未存在,则不会自动创建bean。只有在评估引用bean的EL表达式时,才会自动处理托管bean。访问范围图不会这样做。为此,请在源bean中使用@ManagedProperty。您可以在其值中指定EL表达式。

@ManagedProperty("#{userView}")
private UserView userView; // +setter (no getter required).

请注意,这仅在源bean具有与目标bean相同或更窄的范围时才有效。如果情况并非如此,请考虑使用CDI而不是JSF来管理bean。然后,您可以使用@Inject代替@ManagedProperty(顺便说一下,它不需要设置器)。此外,即将到来的JSF 2.3中@ManagedBean和朋友deprecated

至于eager=true,这只会对@ApplicationScoped bean产生影响。另见javadoc(强调我的)。

  

...

     

如果eager()属性的值为true,且managed-bean-scope值为&#34; application&#34; ,则运行时必须在应用程序启动时实例化此类。实例的实例化和存储必须在任何请求被服务之前发生。如果eager未指定或为false,或者托管bean范围不是&#34; application&#34;,则默认为&#34; lazy&#34;发生了托管bean的实例化和作用域存储。

     

...

另见: