为什么我的 xpage 看不到另一个数据库中的视图?

Why can't my xpage see the views in another database?

(这是用于 Web 浏览器的 XPages 应用程序)我为来自另一个数据库的视图创建了一个视图面板。视图显示为空,尽管我可以使用 Notes 客户端清楚地看到其中大约 15 个文档。这是查看源...

        <xp:viewPanel rows="30" id="viewPanel3">
            <xp:this.facets>
                <xp:pager partialRefresh="true"
                    layout="Previous Group Next" xp:key="headerPager" id="pager2">
                </xp:pager>
            </xp:this.facets>
            <xp:this.data>
                <xp:dominoView var="view3"
                    databaseName="test\Customer\part.nsf"
                    viewName="LkpMscParts-55EQUIPMENT">
                </xp:dominoView>
            </xp:this.data>

我验证了ACL,刷新了视图索引,甚至运行修复了数据库。该页面仍然不会显示文档。 (没有读者字段,顺便说一句)

所以,然后我添加了一个计算字段来告诉我发生了什么。

var filepath = database.getFilePath();
var partfile = filepath.toLowerCase().replace("ereq_main","part");
var partdb = session.getDatabase(database.getServer(),partfile,false);

print("partdb views total = "+partdb.getViews().length)
for(x=0;x<partdb.getViews.length;x++){
    print("v name = "+partdb.getViews[x].getName());
}
print("partdb server = "+partdb.getServer());
print("partdb title = "+partdb.getTitle())

var vname = "LkpMscParts-55EQUIPMENT";
sessionScope.PartViewName = vname;
var pview = partdb.getView(vname);
if(pview==null){
    sessionScope.PartViewError = "Nothing for LkpMscParts-55EQUIPMENT.";
    print("pview is null")
    return null;
}

var vecol = pview.getAllEntries();
print("partdb = "+partdb.getFilePath());
print("pview = "+pview.getName());
print("pview lines = "+pview.getRowLines());
print("vecol count = "+vecol.getCount())
return vname;

我在控制台上得到这个:

11/18/2017 08:10:48 PM  HTTP JVM: partdb views total = 0
11/18/2017 08:10:48 PM  HTTP JVM: partdb server = CN=domsvr3/O=abc
11/18/2017 08:10:48 PM  HTTP JVM: partdb title = Inventory Parts
11/18/2017 08:10:48 PM  HTTP JVM: partdb = test\Customer\part.nsf
11/18/2017 08:10:48 PM  HTTP JVM: pview = 

然后崩溃

Script interpreter error, line=27, col=46: [TypeError] Exception occurred calling method NotesView.getRowLines() Notes error: Invalid or nonexistent document (LkpMscParts-55EQUIPMENT)
Notes error: Invalid or nonexistent document (LkpMscParts-55EQUIPMENT)

请注意视图数组的长度为 0 - 是什么原因造成的?数据库中可能有 200 个视图。数据库服务器正确,标题正确,路径正确。因此,它似乎可以看到正确的数据库。但是,然后视图名称变为空白。所以,pview 不是空的(因为我检查过)但它是空的。我不明白。这么简单的事情让我抓狂。

仅供参考,我使用 xpages 已经有大约 5 年了,所以我确信我遗漏了一些简单的东西,但我就是不能 'see the forest for the trees'。有人可以给我指出正确的方向吗?

如果您使用 "No Login/Anonymous" 访问网络, 然后确保 "Public Access" 已设置 在您的 CustomerParts.nsf -- 通过以下所有方式:

  • 角色 "Anonymous" 的 ACL 允许 "Read Public Documents";
  • 该视图上的每个文档都有一个字段“$PublicAccess”设置为文本“1”;
  • 该目标视图设置为 "Public Access" -- 通过安全 "key" 选项卡,在视图的 "property box";

否则,如果您确实在 Web 上登录,那么 --verify all is ok,在该视图的安全性 "key" 选项卡上。

您是否在应用程序代码的其他地方获取了该数据库?如果是这样,您是在该数据库对象上调用 .recycle() 吗?

我在迁移到 Java 早期学到的一件事是,如果您回收数据库的句柄,return 原始值(例如字符串)的吸气剂仍然 return 价值。大概它被缓存了。所以 getTitle()getFilePath() 仍然是 return 一个值,但是任何变得更复杂的东西都不起作用。我这样做已经有好几年了,但我认为它只是 return 什么都没有。

在极少数情况下我仍然需要回收(我几乎所有项目都使用 ODA),我只循环回收。每个会话的最大句柄数如此之高,因此没有 "PANIC: Lookup handles out of range" 循环外 Domino 对象数量的风险。