【问题标题】:Xpages: managedBean is constantly "losing" global Domino Session objectXpages:managedBean 不断“丢失”全局 Domino Session 对象
【发布时间】:2015-09-07 15:04:42
【问题描述】:

我正在为 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对象总是忘记全局会话,而它可以记住所有其他对象和变量呢?

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

【问题讨论】:

    标签: java session xpages managed-bean xpages-ssjs


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,我不知道这一点。所以你的意思是,'lotus.domino.Document' 的实例也会被回收,而我的数据源不是因为它是 'com.ibm.xsp.model.domino.wrapped.DominoDocument' 的实例?
    • 右:在请求结束时,运行时回收它创建的会话,这也回收所有子会话。 DominoDocument 包装器类具有说明序列化的代码,但实际上最好也根据需要重新获取它。在这里可能不会有什么不同,但在使用 xp:dominoDocument 数据源时,长期不将引用保存在对象中会更安全。
    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 2012-06-24
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多