我正在尝试从外部Java应用程序连接到Lotus DB - 我的代码完全针对位于我的测试(本地)服务器上的数据库,但是在针对生产数据库运行时失败(没有返回数据)。
Diiop
正在生产服务器上运行,我可以访问生产数据库。
我可以通过我的Java代码与Domino服务器创建会话,但是无法打开Lotus DB。
Session session = NotesFactory.createSession("<Server>","UserID","password");
System.out.println("connected");
Database db = session.getDatabase("Server","<DB Path>" );
System.out.println("Access level: "+ db.getCurrentAccessLevel());
View vw = db.getView("Viewname");
在与Domino服务器创建会话后,我尝试打开数据库,此时我收到错误XXX.nsf has not been opened yet
。
我也尝试过使用IsOpen
和open
方法,但没有运气。
答案 0 :(得分:2)
如果您的数据库的ACL禁止访问Internet(这意味着http任务),您的数据库将无法在Java代码中打开。检查ACL的高级选项卡,属性“最大Internet名称和密码”。它至少应该是存储者才能打开它,或读取器来读取它的数据。
答案 1 :(得分:2)
要使diiop正常工作,服务器必须启用允许HTTP客户端浏览数据库设置。此设置位于Server document->Internet Protocols->HTTP->R5 Basics
。值得注意的是,即使在现代Domino服务器实例中,此设置也会生效。我的猜测是这个设置的当前值(设置为“no”)是问题的来源。
您还应确保正确配置diiop。第一个测试是访问 http://hostname.domain.com/diiop_ior.txt 。访问此URL应显示一个页面,其中包含一个包含32个(看似)随机字符的简单文本字符串。
当我需要让diiop工作时,我通常会参考这个page。
答案 2 :(得分:1)
首先尝试使用代码中的名称/密码通过浏览器访问数据库。如果这不起作用,则表示HTTP未运行,或者您的代码存在另一个问题。
对于这样的问题,我从信息中心的示例代码开始。
例如。
Database db = session.getDatabase("<SERVER>", "<DBNAME>");
if (!db.isOpen())
System.out.println("DB does not exist.");
else
System.out.println("Title of database: \"" + db.getTitle()+ "\"") ;
看看是否打印出任何东西。
错误消息通常表示数据库已被服务器锁定或已损坏。因此,尝试另一个您知道必须具有访问权限的数据库(例如names.nsf)。
答案 3 :(得分:1)
出于好奇,打印是什么:
session.getUserName();
..在getCurrentAccessLevel()
展示之前?是否有一个含糊不清的用户名,你最终被认证为你不期望的人?
答案 4 :(得分:0)
我遇到了同样的错误
Database xxx.nsf has not been opened yet
我的问题是由于使用了正斜杠而不是反斜杠。这纠正了它:
var db = session.getDatabase(session.getServerName(), "path/dbname.nsf");
我注意到在上面的问题中没有找到db路径,所以也许正在使用错误的斜杠。
令人恼火的部分是,而不是返回错误消息'找不到文件',而事实上它无法找到,因此NotesException消息是pathdbname.nsf has not been opened yet
...