“javax.naming.NoInitialContextException”是什么意思?

21

正如标题所示,“javax.naming.NoInitialContextException”在非技术术语中是什么意思?有哪些一般性的建议可以修复它?

编辑(来自控制台):

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:25)
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:10)
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:30)
    at cepars.review.Test.main(Test.java:43)
java.lang.NullPointerException
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:31)
    at cepars.review.Test.main(Test.java:43)
cepars.app.DAOException
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:39)
    at cepars.review.Test.main(Test.java:43)

1
这只是意味着存在一种异常情况,其中无法创建任何初始上下文,因此代码无法继续执行其被告知要做的事情。消息和堆栈跟踪包含更重要的信息。为了能够修复问题的根本原因,请同时分享它们。 - BalusC
重复的问题没有被接受的答案。请不要声称问题已有答案,除非它们有已被接受的答案。 - David Williams
我曾经在使用CDI(即@Inject)时遇到过类似的问题,尝试运行Junit集成测试但没有使用RunWith(Arquillian.class)! - Michał Ziobro
https://docs.oracle.com/javase/tutorial/jndi/ops/faq.html#1 - ROMANIA_engineer
4个回答

34

这意味着没有初始上下文 :)

但是说真的,JNDI(javax.naming)关注于从某个目录或提供者查找对象或资源。要查找某些内容,您需要有地方可查(这就是InitialContext)。NoInitialContextException意味着“我想找John Smith的电话号码,但我没有电话簿可查看”。

可以通过任何数量的方式创建InitialContext。例如,手动创建到LDAP服务器的连接。它还可以由应用程序服务器设置,在其中运行应用程序。在这种情况下,容器(应用程序服务器)已经为您提供了一个“电话簿”,通过它可以查找应用程序服务器提供的任何内容。这通常是可配置的,并且是将此类型的配置从应用程序实现移动到容器的常见方法,以便可以在服务器中的所有应用程序间共享。

更新:从您发布的代码片段来看,似乎您正在尝试独立运行应该在应用程序服务器中运行的代码。在这种情况下,代码尝试从“电话簿”获取与数据库的连接。这是应用程序服务器容器中经常配置的资源之一。因此,您无需在代码中管理配置和与数据库的连接,而可以在应用程序服务器中进行配置,并使用JNDI在代码中简单地请求连接。


4
我喜欢你用电话簿的比喻。个人仍对细节感到困惑,但你的回答为我提供了概念上的概览。 - user2316667

14

这基本上意味着应用程序想要执行一些“命名操作”(例如JNDI或LDAP查找),但没有足够的信息可用来创建与目录服务器的连接。正如异常文档所述,

  

当无法创建初始上下文实现时,抛出此异常。如何选择初始上下文实现的策略在InitialContext类的文档中进行了描述。

如果您仔细查看InitialContext的javadocs,它们很好地描述了如何构建初始上下文以及提供地址/凭据等选项。

如果您尝试创建上下文并卡在其他地方,请回帖说明您迄今为止做了什么以及您遇到的问题。


6

请阅读文档

当无法创建初始上下文实现时,将抛出此异常。如何选择初始上下文实现的策略在InitialContext类的文档中有描述。

此异常可能在与InitialContext的任何交互期间抛出,不仅在构造InitialContext时。例如,初始上下文的实现可能只有在调用实际方法时才惰性检索上下文。应用程序不应依赖于何时确定是否存在初始上下文。

但是,在InitialContext的文档中更好地解释了这一点。


@Oracle:InitialContext是一个非常愚蠢、毫无意义的名称。它是由毫无意义的单词“initial”和“context”组合而成,可以用于任何地方、任何事情。此外,上面的段落使用了8次单词“context”来解释“InitialContext”。更好的名称应该是JavaNamingAndDirectoryInitialContext,或者至少是NamingAndDirectoryInitialContext。或者重新考虑整个命名方式,给出有意义的名称。当然,JNDI有点抽象,但我认为“InitialContext”真的是一个糟糕的选择。 - aliopi
2
同意。但你可能应该把这个批评指向Oracle。你现在是在打击传递信息的人。 - Sean Patrick Floyd

-2
在非常非技术性的说法中,这可能意味着您忘记在您尝试连接的URI的开头放置"ejb:"或"jdbc:"或其他内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接