2012-04-02 71 views
2

我在觀察我的requestScoped bean,如下所述,在單個請求期間多次創建。每次這個bean被重新實例化時,就在很久以前,這個bean已經被銷燬了,就像日誌所說的那樣。在單個請求期間多次創建/銷燬RequestScoped 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的原因之前完成單個請求的所有處理&我怎麼照顧不要讓這種事情發生的被破壞?


編輯:

我在我的小面的代碼一些地方導致請求被多次觸發了<p:graphicImage url="#" />。刪除這些後,我仍然看到這個請求創建,但只有兩次,以前它是更多的時間。

其實我在嘗試登錄到我的應用程序時看到了這個。所以在提供憑證&後,它們被驗證,bean被實例化使用&,但在此之後,用戶被移動到成功的登錄頁面&,在構建期間再次需要該bean,因此它被創建爲原樣不存在的。這導致這個請求scoped bean被創建2次,因爲我相信這只是一個請求。

回答

1

您的登錄可能會將瀏覽器重定向到一個新頁面,其中包含Location:標頭,這非常正常。所以你應該期待兩個請求,因此需要兩個請求範圍的bean。同樣,如您注意到的,鏈接的圖像會導致另一個瀏覽器請求。這就是網絡的工作原理。如果它困擾了你很多,你可以使用不同的範圍(例如會話,所以每個登錄用戶一個bean),但要小心選項卡式瀏覽。