我正在使用GF4。在我的应用程序中,我有一个主菜单,用户始终可以看到。其中一个菜单项指的是正在创建的@ViewScoped
支持bean,每次用户单击此菜单项时都会调用其@PostConstruct
方法,这是预期的行为。
问题在用户点击其他菜单项时出现,因为@ViewSoped bean仍然存在,即未调用其@PreDestroy
方法。
寻找答案我遇到了这个stackoverflow post,建议设置这两个参数:
com.sun.faces.numberOfViewsInSession
和com.sun.faces.numberOfLogicalViews
。
由于我一次只想要一个@ViewScoped bean,我将它们都设置在 web.xml 中1
。但这没有效果!因此我的问题是:
有没有办法影响容器托管bean,即手动销毁它们?
提前致谢!
答案 0 :(得分:0)
我在这里找到了答案JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?。那里的用户在他的问题中提供了解决方案。因此,必须实现那里描述的自定义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>