簡體   English   中英

JNDI失敗,出現NameNotFoundException

[英]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
在文件中有此條目:QRep​​ly / 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名稱。 您甚至可以這樣說:

在文件中有此條目:QRep​​ly / FactoryName = com.ibm.mq.jms.MQQueueFactory

如果輸入是:“ jms / label / QReply”,則您的第二個測試將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM