在单个请求期间多次创建/销毁RequestScoped bean

时间:2012-04-02 18:17:56

标签: java jsf jsf-2

我观察到我在下面描述的requestScoped bean在单个请求期间被多次创建。根据日志的说法,每次重新实例化bean时,就在不久之前,bean被销毁了。

@ManagedBean(name="namesDirectory")
@RequestScoped
public class NamesDirectory {

    public static NamesDirectory getCurrentInstance(){
        FacesContext context = FacesContext.getCurrentInstance();            
        return context.getApplication().evaluateExpressionGet(context, "#{namesDirectory}", NamesDirectory.class);
    }

    @PostConstruct
    public void foo(){
        Easy.log("bean created");
    }

    @PreDestroy
    public void foo1(){
        Easy.log("bean destroyed");
    }

}

在单个请求的所有处理完成之前,bean被销毁的原因是什么?我如何照顾不让这件事发生?


编辑:

我在facelets代码中的某些地方<p:graphicImage url="#" />导致多次触发请求。删除这些后,我仍然看到这个请求已经创建,但只是两次以前它已经多次了。

实际上我在尝试登录我的应用程序时看到了这一点。因此,在提供凭证之后&amp;他们经过验证,豆子被实例化了。使用但是在此之后用户被移动到成功的登录页面&amp;在构建中再次需要bean时,因此它是不存在的。这会导致这个请求范围的bean被创建2次,因为我认为,这只是一个请求。

1 个答案:

答案 0 :(得分:1)

您的登录信息可能会将浏览器重定向到带有Location:标题的新页面,这很正常。所以你应该期待两个请求,因此需要两个请求范围的bean。同样,正如您所注意到的,链接的图像会导致另一个浏这就是网络的运作方式。如果它困扰你那么多,你可以使用不同的范围(例如会话,每个登录用户一个bean),但要注意选项卡式浏览。