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 中会话的每次使用。
我正在为 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 中会话的每次使用。