[英]JNDI failing with NameNotFoundException
我正在為內部庫(其中幾乎沒有創建者)編寫回歸測試,並且正在嘗試驗證環境。 僅當jndi名稱為“ complex”時,一些測試才會因NameNotFoundException失敗。
這是一個獨立的應用程序,未與任何Web容器一起運行。 該應用程序使用首選項文件,並且不涉及LDAP。 該環境是Java v1.4,並且該應用程序安裝有本地所有必需的庫。 (帶有jndi.jar,jms.jar ...等的lib目錄)。 簡單吧?
由於該庫的復雜性以及它如何與許多對象融合在一起,我進行了一個簡單的測試,然后增加了復雜性,並將其添加為單獨的測試。
設置:文件:c:\\ data \\ eclipse \\ workspace \\ APP \\ testfiles \\ jndi \\ jms \\ label \\ .bindings
在文件中有此條目:QReply / FactoryName = com.ibm.mq.jms.MQQueueFactory
UnitTest類:“簡單”測試有
Hashtable ht = new Hashtable();
ht.put(Context.PROVIDER_URL,
"file:/data/eclipse/workspace/APP/testFiles/jndi/jms/label/");
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
ht.put(Context.SECURITY_AUTHENTICATION, "none");
Context ctx;
try {
ctx = new InitialContext(ht);
String jndiName = "QReply";
logger.debug("testFindRemoteObject_Simple",
"Invoking InitialContext.lookup(\"" + jndiName + "\")");
Object remoteObject = ctx.lookup(jndiName);
assertTrue(remoteObject != null);
} catch (NamingException e) {
e.printStackTrace();
fail(e.getMessage());
}
這樣過去了。 因為我在使用庫時遇到了很多麻煩,所以我創建了另一個測試,該測試與傳入的實際數據相匹配。 提供商URL會縮短,並且jndi名稱會選擇一個“路徑”。
“實際”數據單元測試:
final Hashtable ht = new Hashtable();
ht.put(Context.PROVIDER_URL,
"file:/data/eclipse/workspace/APP/testFiles/jndi/");
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
ht.put(Context.SECURITY_AUTHENTICATION, "none");
Context ctx;
try {
ctx = new InitialContext(ht);
String jndiName = "jms/label/QReply";
logger.debug("testFindRemoteObject_Actual",
"Invoking InitialContext.lookup(\"" + jndiName + "\")");
Object remoteObject = ctx.lookup(jndiName);
assertTrue(remoteObject != null);
} catch (NamingException e) {
e.printStackTrace();
fail(e.getMessage());
}
哪個失敗
javax.naming.NameNotFoundException: jms/label/QReply
at com.sun.jndi.fscontext.RefFSContext.getObjectFromBindings(
RefFSContext.java:400)
at com.sun.jndi.fscontext.RefFSContext.lookupObject(RefFSContext.java:327)
at com.sun.jndi.fscontext.RefFSContext.lookup(RefFSContext.java:146)
at com.sun.jndi.fscontext.FSContext.lookup(FSContext.java:127)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at com.advo.tests.services.UnitTestServiceLocator.testFindRemoteObject_Actual(
UnitTestServiceLocator.java:85)
其中UnitTestServiceLocator.java:85是ctx.lookup(jndiname);
為什么簡單的測試通過但更復雜的測試失敗? 兩者都使用指向lib目錄的類路徑,該目錄由jms和mq jar填充(除其他外)。
復雜測試與庫將填充的內容匹配,但使用魔術作為傳入的值。 庫代碼多了幾行,從首選項文件中提取魔術值。 我想念什么? 庫代碼將在服務器上運行,但在筆記本電腦上(開發時)將失敗。
我什至還創建了另一條jndi路徑-以防萬一第一個測試弄糟了第二個。 仍然失敗。
由於我沒有任何願望(或更改庫代碼的權限),因此調用InitialContext(X); 那樣是因為庫就是這樣做的。 我看過其他示例,但InitialContext沒有傳遞任何內容,我感到困惑,為什么這樣做更好。
更新:我已經在linux java1.5上創建了一個jndi_test項目,該項目成功運行了失敗的測試。 使用相同的源並將其移至Windows環境-測試失敗。 由於在Linux上沒有C驅動器,但數據文件相同,因此對類路徑進行了一些更改。 (嗯,定界符問題?)
我還發現如果我要在1.5上運行該庫,我會遇到問題,但這是附帶問題。
我認為您與JNDI名稱混為一談。
“ QReply”是JNDI名稱。 您甚至可以這樣說:
在文件中有此條目:QReply / FactoryName = com.ibm.mq.jms.MQQueueFactory
如果輸入是:“ jms / label / QReply”,則您的第二個測試將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.