我有以下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}" ...>
,但它仍为空,我无法弄清楚原因。
任何建议都将不胜感激。
答案 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的实例化和作用域存储。
...