Xpages:managedBean不断“丢失”全局Domino Session对象

时间:2015-09-07 15:04:43

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

我正在为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绑定到会话范围,但这根本没有帮助。是的,我甚至在做出改变之后重新启动了整个服务器......

1 个答案:

答案 0 :(得分:7)

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