Xpages: managedBean 不断 "losing" 全局 Domino Session 对象

Xpages: managedBean is constantly "losing" global Domino Session object

我正在为 Xpages 应用程序构建 managedBean。目前该 bean 在视图范围的 faces-config 中注册,因为我需要它在每次加载页面时重新初始化(见下文)。 bean 的构造函数初始化几个 class 变量,这些变量的值在整个 class 代码中都被引用。其中一个变量是 Domino session 对象,另一个例子是当前 document datasource:

private Session session;
private DominoDocument ds;

两者都在构造函数中初始化为

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

(resolveVariable是一个内部辅助方法;我想我不需要在这里解释)

除了构造函数和各种辅助方法之外,在同一 class 中还有一些其他 public 方法会在单击按钮时调用。大多数这些附加方法都使用相同的文档数据源以及当前会话对象。

我的附加方法可以访问和使用全局数据源对象 (ds),但是如果它们尝试访问全局会话对象,则会抛出错误;在堆栈跟踪的更下方,我发现似乎是什么导致了错误:

NotesException: Object has been removed or recycled

现在我的代码中根本没有回收,会话对象一定在途中丢失了。

作为解决方法,我开始将会话对象从 SSJS 传递到每个方法中,如

public void testMethod(Session s){ System.out.println("my name is " + s.getEffectiveUserName()); }

哪个工作正常。但是为什么bean对象总是忘记全局session而它能记住所有其他对象和变量呢?

顺便说一句:我试图将我的 managedBean 绑定到会话范围,但这根本没有帮助。是的,我什至在进行更改后重新启动了整个服务器...

来自运行时的所有 Domino 对象在每个请求结束时被回收。如果你想访问它们中的任何一个,你应该在需要时从环境中重新获取它们,而不是在你的意思内存储引用(你可以使用 transient refs,但你不会得到太多)。因此,快速解决方法是用 DominoUtils.getCurrentSession() 调用替换 class 中会话的每次使用。