2015-09-07 21 views
3

我正在爲Xpages應用程序構建managedBean。目前該bean在視圖範圍的faces-config中註冊,因爲我需要它在每次頁面加載時重新初始化(,請參閱下面的)。這個bean的構造函數初始化幾個類變量,這些變量的值在整個類的代碼中被引用。一這些變量是Domino session對象,另一實例是當前document datasourceXpages:managedBean不斷「失去」全局Domino會話對象

private Session session; 
private DominoDocument ds; 

兩者在構造函數中初始化爲

session=DominoUtils.getCurrentSession(); 
ds=(DominoDocument) resolveVariable(dsName); 

resolveVariable是一個內部輔助方法;不認爲我需要在這裏解釋一下)

除了構造函數和各種幫助器方法之外,還有一些其他的公共方法在同一個類中調用按鈕點擊。大多數這些附加方法使用相同的文檔數據源以及當前的會話對象。

發生什麼事是我的其他方法可以訪問和使用全局數據源對象(ds),但是如果他們嘗試訪問全局會話對象時會拋出錯誤;進一步下跌的堆棧跟蹤我找到了似乎導致錯誤:

NotesException: Object has been removed or recycled 

有沒有回收在我的代碼在現在好了,會話對象必須迷路在途中的某個地方。

作爲一種變通方法,我開始從SSJS傳遞會話對象到每一個方法,在

公共無效TestMethod的(會話S){ 的System.out.println(「我的名字是」 + s.getEffectiveUserName() ); }

哪個工作正常。但是,爲什麼bean對象在記住所有其他對象和變量的同時總是忘記全局會話呢?

順便說一句:我試圖將我的managedBean綁定到會話範圍,但根本沒有任何幫助。是的,我甚至在做出更改後重新啓動了整個服務器...

回答

7

所有來自運行時的Domino對象都在每個請求結束時被回收。如果你想訪問它們中的任何一個,你應該在需要的時候從環境中重新獲取它們,而不是在你的意思中存儲引用(你可以使用transient引用,但你不會獲得太多)。因此,快速解決方案是用您撥打DominoUtils.getCurrentSession()的電話替換班級中的每個會話。

+0

非常感謝,我沒有意識到這一點。所以你的意思是,'lotus.domino.Document'的一個實例也將被回收,而我的數據源並不是因爲它是'com.ibm.xsp.model.domino.wrapped.DominoDocument'的一個實例? –

+1

正確:在請求結束時,運行時將回收它創建的會話,這也會回收所有的孩子。 DominoDocument包裝類有代碼來說明序列化,但實際上最好根據需要重新獲取它。它可能在這裏沒有什麼不同,但是在使用'xp:dominoDocument'數據源時,不要在對象中保存引用是更安全的。 –