2015-09-07 47 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'数据源时,不要在对象中保存引用是更安全的。 –