我正在爲Xpages應用程序構建managedBean。目前該bean在視圖範圍的faces-config中註冊,因爲我需要它在每次頁面加載時重新初始化(,請參閱下面的)。這個bean的構造函數初始化幾個類變量,這些變量的值在整個類的代碼中被引用。一這些變量是Domino session
對象,另一實例是當前document datasource
:Xpages: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綁定到會話範圍,但根本沒有任何幫助。是的,我甚至在做出更改後重新啓動了整個服務器...
非常感謝,我沒有意識到這一點。所以你的意思是,'lotus.domino.Document'的一個實例也將被回收,而我的數據源並不是因爲它是'com.ibm.xsp.model.domino.wrapped.DominoDocument'的一個實例? –
正確:在請求結束時,運行時將回收它創建的會話,這也會回收所有的孩子。 DominoDocument包裝類有代碼來說明序列化,但實際上最好根據需要重新獲取它。它可能在這裏沒有什麼不同,但是在使用'xp:dominoDocument'數據源時,不要在對象中保存引用是更安全的。 –