如何限制@ViewScoped bean

时间:2016-10-06 16:19:31

标签: jsf java-ee mojarra

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

问题在用户点击其他菜单项时出现,因为@ViewSoped bean仍然存在,即未调用其@PreDestroy方法。

寻找答案我遇到了这个stackoverflow post,建议设置这两个参数: com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews。 由于我一次只想要一个@ViewScoped bean,我将它们都设置在 web.xml 1。但这没有效果!因此我的问题是:

  1. web.xml 是对的吗?
  2. 有没有办法影响容器托管bean,即手动销毁它们?

    提前致谢!

1 个答案:

答案 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>