如何限制@ViewScoped bean的数量
How to limit the number of @ViewScoped beans
我正在使用 GF4。在我的应用程序中,我有一个用户始终可见的主菜单。其中一个菜单项引用 @ViewScoped
支持 bean,它正在创建,每次用户单击此菜单项时都会调用其 @PostConstruct
方法,这是预期的行为。
当用户点击其他菜单项时,问题出现,因为@ViewSoped bean 继续存在,即它的@PreDestroy
方法没有被调用。
在寻找答案时我遇到了这个 Whosebug post,它建议设置这两个参数:
com.sun.faces.numberOfViewsInSession
和com.sun.faces.numberOfLogicalViews
。
因为我一次只想要一个@ViewScoped bean,所以我将它们都设置在 web.xml 到 1
中。但这没有任何作用!因此我的问题是:
web.xml是正确的地方吗?
有没有办法影响容器管理的 bean,即手动销毁它们?
提前致谢!
我在这里找到了答案。那里的用户在他的问题中提供了解决方案。因此,必须按照那里的描述实施自定义 HttpSessionListener
。
为了使解决方案完整,我添加了配置部分。假设您的实现如下所示:
public class CustomViewMapConfig implements HttpSessionListener
{
@Override
public void sessionCreated(HttpSessionEvent event)
{
event.getSession().setAttribute(ViewScopeManager.ACTIVE_VIEW_MAPS_SIZE, 1);
}
}
那么对应的web.xml是这样的:
<web-app>
<listener>
<listener-class>my.package.CustomViewMapConfig</listener-class>
</listener>
...
</web-app>
我正在使用 GF4。在我的应用程序中,我有一个用户始终可见的主菜单。其中一个菜单项引用 @ViewScoped
支持 bean,它正在创建,每次用户单击此菜单项时都会调用其 @PostConstruct
方法,这是预期的行为。
当用户点击其他菜单项时,问题出现,因为@ViewSoped bean 继续存在,即它的@PreDestroy
方法没有被调用。
在寻找答案时我遇到了这个 Whosebug post,它建议设置这两个参数:
com.sun.faces.numberOfViewsInSession
和com.sun.faces.numberOfLogicalViews
。
因为我一次只想要一个@ViewScoped bean,所以我将它们都设置在 web.xml 到 1
中。但这没有任何作用!因此我的问题是:
web.xml是正确的地方吗?
有没有办法影响容器管理的 bean,即手动销毁它们?
提前致谢!
我在这里找到了答案HttpSessionListener
。
为了使解决方案完整,我添加了配置部分。假设您的实现如下所示:
public class CustomViewMapConfig implements HttpSessionListener
{
@Override
public void sessionCreated(HttpSessionEvent event)
{
event.getSession().setAttribute(ViewScopeManager.ACTIVE_VIEW_MAPS_SIZE, 1);
}
}
那么对应的web.xml是这样的:
<web-app>
<listener>
<listener-class>my.package.CustomViewMapConfig</listener-class>
</listener>
...
</web-app>