我正在为Xpages应用程序构建managedBean。目前,bean在视图范围的faces-config中注册,因为我需要它在每个页面加载时重新初始化(参见下面的)。 bean的构造函数初始化了几个类变量,这些变量的值在整个类的代码中被引用。其中一个变量是Domino session
对象,另一个例子是当前document datasource
:
private Session session;
private DominoDocument ds;
两者都在构造函数中初始化为
session=DominoUtils.getCurrentSession();
ds=(DominoDocument) resolveVariable(dsName);
(resolveVariable
是一个内部帮助方法;不要认为我需要在这里解释一下)
除了构造函数和各种帮助器方法之外,在同一个类中还有一些其他公共方法在按钮单击时调用。大多数这些附加方法都使用相同的文档数据源以及当前的会话对象。
发生的事情是我的其他方法可以访问和使用全局数据源对象(ds
)但是如果他们尝试访问全局会话对象则会引发错误;在堆栈跟踪的下方,我发现了导致错误的原因:
NotesException: Object has been removed or recycled
我的代码现在根本没有回收,会话对象必须在途中丢失。
作为一种解决方法,我开始将会话对象从SSJS传递到每个方法,如
public void testMethod(Session s){ System.out.println(“我的名字是”+ s.getEffectiveUserName()); }
哪个工作正常。但是为什么bean对象会记住所有其他对象和变量而忘记全局会话?
BTW:我试图将我的managedBean绑定到会话范围,但这根本没有帮助。是的,我甚至在做出改变之后重新启动了整个服务器......
答案 0 :(得分:7)
来自运行时的所有Domino对象都会在每个请求结束时被回收。如果您想访问其中任何一个,您应该在需要时从环境中重新获取它们,而不是在您的意思中存储引用(您可以使用transient
参考,但您不会获得很多)。因此,快速解决方法是使用DominoUtils.getCurrentSession()
调用替换您班级中会话的每次使用。