如何限制@ViewScoped bean的数量

How to limit the number of @ViewScoped beans

我正在使用 GF4。在我的应用程序中,我有一个用户始终可见的主菜单。其中一个菜单项引用 @ViewScoped 支持 bean,它正在创建,每次用户单击此菜单项时都会调用其 @PostConstruct 方法,这是预期的行为。

当用户点击其他菜单项时,问题出现,因为@ViewSoped bean 继续存在,即它的@PreDestroy 方法没有被调用。

在寻找答案时我遇到了这个 Whosebug post,它建议设置这两个参数: com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews。 因为我一次只想要一个@ViewScoped bean,所以我将它们都设置在 web.xml1 中。但这没有任何作用!因此我的问题是:

  1. web.xml是正确的地方吗?

  2. 有没有办法影响容器管理的 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>