序言:上次我在扩展库中遇到问题时,我立即在openNTF.org上发布了一个错误报告。然后结果发现我错过了一个让一切都完美无缺的财产设置。为了防止这个问题再次发生,我决定先在这里发布问题,任何人都可以重现我所遇到的错误,或者我在xe:DynamicViewPanel控件上缺少一个属性?
测试过的ExtLib版本测试:
使用Domino / Notes版本 Domino 9.0.1
重现的步骤
创建仪表板XPage应用程序。 - 数据存储在不同的数据库中。
使用dynamicViewPanel控件,访问位于 ON SAME SERVER 的数据库,并在视图中显示该数据库中的信息。
单击动态视图面板中的文档链接,然后在浏览器中查看URL。当dynamicViewPanel指向与仪表板在同一服务器上托管的其他数据库中的视图时,该URL如下所示:
http://path/Portal.nsf/%24%24OpenDominoDocument.xsp?的databaseName = CN =大师/ O = HOL-dev的/ C = DE !!路径/ Portal.nsf &安培; documentId = A6727D8AF7D2FE19C1257C9E0034A14C&安培;行动= editDocument
将打开由所单击文档的表单名称定义的相应X页,并且甚至可以加载保存在该文档中的数据。
单击一个按钮,该按钮使用定义的文档数据源执行任何操作。它可以像在notesXspDoc.isNewNote()中将字符串打印到服务器一样简单。您将收到一条错误消息,指出(在上面的情况下)NotesXSPDocument.isNewNote()null。这意味着变量IS not null,但由于某种原因,您将获得null错误响应。
仅当仪表板和数据数据库位于同一台Domino服务器上时才会发生此错误。只要其中一个被移动,它就会完美地运行并且URL将被正确写入; databaseName参数的服务器名称将以缩写方式写入。
为了理解/解决这个问题,我仔细研究了扩展库类com.ibm.xsp.extlib.component.dynamicview.UIDynamicViewPanel中的代码。在那里,我找到了对super(XspViewPanel).getDocumentUrl()的调用。我的猜测是错误在于该函数,但这不是由ExtLibs定义的类。至少我很想知道那里写的是什么。
有根据的猜测
我非常确定以下内容:第一次打开时的页面因为密钥信息保存在requestScope中而加载。此信息不会传递到由NotesXspDocument javascript'类创建的java DominoDocument对象。当(在后台)调用DomDoc.restoreDocument()函数时,它会尝试查找数据库CN(由param.get(" databaseName")函数返回)并失败。因此,不能在对象上调用其他函数,因为总是会抛出异常。 (这对我来说是一个有根据的猜测)
我的问题已明确说明
非常感谢您提供的所有帮助!
修改
改变" ignoreRequestParams" property to true并计算databaseName和documentID根本没有区别。我真的很困惑为什么它不起作用,我认为计算源信息而不关注请求参数会解决它,但我遇到了同样的问题。任何进一步的帮助将不胜感激!
答案 0 :(得分:0)
经过大量测试,删除功能并重新添加它们后,我想我已经找到了答案。我真的不能说这是为什么,如果我的想法是正确的,我觉得它很糟糕。
我发现当我注释掉一个在后台java类中打开数据库的javascript行来查找用户的当前角色时,它再次起作用。经过进一步调查,当我拿出回收源数据库的java行时,仪表板再次运行。但是,这意味着后台c ++对象仍然存在于某个地方的背景中。在此项目中,当源DB和仪表板数据库托管在同一服务器上时,似乎只是一个问题。
我将回答我的问题“不,这不是dynamicViewPanel中的错误”,而是来自IBM本身的可疑设计。我们应该回收我们的Notes对象,或者我们不应该回收我们的Notes对象,或者我们应该给出非回收时间和时间的非常详细的描述。也许我只是不习惯做我自己的GC。这是给我带来困难的代码(一些变量名称已经改变以保护客户的匿名性):
public String getDatabaseRoles(){
Session session = null;
Database db = null;
Vector<String> roles = null;
try {
session = SessionHelper.getCurrentSession();
db = DatabaseController.getApplicationInstance().getDbFile().getDatabase();
roles = db.queryAccessRoles(session.getEffectiveUserName());
} catch (NullDatabaseException e) {
// already logged
} catch (NotesException e) {
ErrorWriter.getSessionInstance().writeError(new Date(), ErrorLevel.ERROR, "EprDatabaseController.getDatabaseRoles()",
e);
} catch (NullSessionException e) {
// already logged
} finally {
//if(db != null) try {db.recycle();} catch(NotesException e) {} //commented out due to issues when portal is on same server as data.
//if(session != null) try {session.recycle();} catch(NotesException e) {}
}
StringBuilder roleStr = new StringBuilder();
if(roles != null){
for(String role : roles){
if(!StringHelper.isNullOrEmpty(role)){
roleStr.append(role);
roleStr.append(":");
}
}
}
ErrorWriter.getSessionInstance().writeError(new Date(), ErrorLevel.TRACE, "DatabaseController.getEPRDatabaseRoles()",
"Database Roles: " + roleStr.toString());
return roleStr.toString();
}
同样,只有这样的解决方法已经为未来的读者解答了,
这不是我的问题的真正答案,我只是把它放在这里,以方便用户使用。 德尔>