我刚刚遇到了一个我无法修复的奇怪的JAVA问题。
我调用JAVA bean从视图中检索一些值。 为此,我调用JAVA类来进行查找。
查询被调用两次。一旦使用currentUser id,然后使用SessionAsSigner检索文档,currentUser因读取器字段而无法读取。
以下是我的观察:似乎第一次检索会话(asSigner或currentSession)时,此会话将是您可以在此线程中使用的唯一会话。一旦调用另一个方法,它仍然是currentSession或asSigner会话。
我尝试重新编写会话,编写只携带会话的2个bean,编写两个JAVA类,每个类托管不同的会话,结果始终相同。初始化的第一个会话是您可以获得的唯一会话。要检索我已经使用ExtLib类,DomUtils和VariableResolver的会话,但无论我如何获得会话,它似乎总是相同的问题。
这是一个小例子,我得到的结果是:
示例1:
Session s=Util.getCurrentSession()
Vector<String>=result=Util.lookup(s,view,key)
//result is empty because user cant read the documents -OK
Session s=Util.getSessionasSigner()
Vector<String>=result=Util.lookup(s,view,key)
//result is empty although Signer can read document -NOK
示例2
Session s=Util.getSessionasSigner()
Vector<String>=result=Util.lookup(s,view,key)
//result returns the documents -OK
Session s=Util.getCurrentSession()
Vector<String>=result=Util.lookup(s,view,key)
//result again returns the documents allthough the user shouldnt be able to read it -NOK
所以无论我做什么,第二次通话总是错的,因为那个问题。 有谁知道我能做些什么。
答案 0 :(得分:4)
这里有一些可能的选项,具体取决于你的util方法在做什么。
本问题SessionAsSigner - database object conflicts概述了一个。
另一个可能与你如何获得相关数据库有关?在获得另一个会话后,getCurrentDatabase()
无法与sessionAsSigner
一起使用。您需要第二次使用getDatabase()。
为了获得sessionAsSigner,我建议使用ExtLibUtil.getCurrentSessionAsSigner()
。重新发明轮子毫无意义。
另外,请勿回收session
。回收任何Domino对象都会回收所有后代。因此,您基本上回收了在请求周期中创建但未在其他位置发布的任何Domino引用。它可能会产生一些奇怪的影响,这些影响很难确定。在循环之外回收任何东西的唯一时间就像Sven对第一个问题的回答所述。
答案 1 :(得分:2)
谢谢保罗,我发现了它。你带我到了正确的方向。
尽管我使用getDatabase作为一种方法,但在使用后我必须回收数据库对象。看起来没有回收它仍然保持会话到数据库,我不能得到sessionAsSigner会话。
在我回收数据库对象之后,我就能够获得sessionAsSigner会话并返回正确的文档。