JNDI使用NameNotFoundException失败

时间:2009-02-18 19:58:45

标签: java jndi

我正在为内部图书馆编写回归测试(创作者已经离开了),我正在尝试验证环境。只有当jndi名称为“复杂”时,一些测试才会继续使用NameNotFoundException。

这是一个独立的应用程序,并没有与任何Web容器一起运行。该应用程序使用首选项文件,并且不涉及LDAP。环境是Java v1.4,应用程序安装了本地所有必需的库。 (lib dir with jndi.jar,jms.jar ... etc)。简单,对吧?

由于库的复杂性以及它如何使用大量对象,我有一个简单的测试,然后增加每个部分的复杂性作为单独的测试。

设定: 文件: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(以及其他内容)。

复杂测试匹配库将填充的内容,但使用magic作为传入的值。库代码具有“少”多行,从首选项文件中提取魔术值。 我错过了什么?库代码可以在服务器上运行但在我的笔记本电脑上运行失败(开发时)。

我甚至创建了另一个jndi路径 - 以防万一第一次测试正在破坏第二次测试。仍然失败。

由于我没有任何愿望(或更改库代码的权限),因此调用InitialContext(X);是这样的,因为这是图书馆的方式。我已经看过其他一些没有通过InitialContext传递的例子,我很困惑为什么那样更好。

更新: 我已经在linux java1.5上创建了一个jndi_test项目,并成功运行了失败的测试。使用相同的源并将其移动到Windows环境 - 测试失败。由于Linux上没有C驱动器但数据文件相同,因此类路径有一些变化。 (嗯分隔符问题?)

我还发现我在使用该库时遇到问题如果我要在1.5上运行它,但这是一个副作用。

1 个答案:

答案 0 :(得分:0)

我认为你和JNDI的名字混在一起。

“QReply”是JNDI名称。你甚至这么说:

  

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

如果条目是:“jms / label / QReply”那么你的第二次测试就可以了。