小编Jon*_*ich的帖子

为什么过期的@ViewScoped bean在会话到期之前不会被销毁

我在使用Java 7的GlassFish 4上使用Mojarra 2.2.4.

据我所知,从BalusC的回答是如何以及何时在JSF中销毁@ViewScoped bean?,@ViewScoped bean应该在三种情况下销毁:

  1. 回复非空结果
  2. 会话到期
  3. 超出会话中的最大逻辑视图数

我的bean在前两种情况下被销毁,但是在超过最大逻辑视图数时却没有.我已经验证了bean 在超过最大值时会过期(我得到一个ViewExpiredException),但是在会话本身到期之前它们仍然没有被销毁.

出于内存消耗的原因,我想在第三种情况下销毁bean,特别是因为它们在到期后无法使用.

问题

  • 为什么豆子到期时不会被销毁?
  • 这是一个错误还是预期的行为?
  • 什么是干净的解决办法,以确保豆类被摧毁?

最小的例子

这是我的豆子:

@javax.inject.Named("sandboxController")
@javax.faces.view.ViewScoped
public class SandboxController implements Serializable {
    private static final Logger log = Logger.getLogger(SandboxController.class.getName());
    @PostConstruct
    public void postConstruct() {
        log.log(Level.INFO, "Constructing SandboxController");
    }
    @PreDestroy
    public void preDestroy() {
        log.log(Level.INFO, "Destroying SandboxController");
    }
    public String getData() {
        return "abcdefg";
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的sandbox.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML …
Run Code Online (Sandbox Code Playgroud)

jsf-2 managed-bean mojarra view-scope jsf-2.2

7
推荐指数
1
解决办法
4607
查看次数

标签 统计

jsf-2 ×1

jsf-2.2 ×1

managed-bean ×1

mojarra ×1

view-scope ×1