[英]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.