【问题标题】:What does "javax.naming.NoInitialContextException" mean? [duplicate]“javax.naming.NoInitialContextException”是什么意思? [复制]
【发布时间】:2011-09-17 06:02:02
【问题描述】:

正如标题所示,“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)

【问题讨论】:

  • 这只是意味着存在一种特殊情况,其中无法创建初始上下文,因此代码无法继续执行任何被告知的操作。消息和堆栈跟踪包含更重要的信息。也分享它们,以便能够解决问题的根本原因。
  • 副本没有可接受的答案。请不要在没有接受答案的情况下说问题有答案。
  • 我在 java ee 中使用 CDI 时遇到过类似的情况,即 @Injection 并尝试在没有 RunWith(Arquillian.class) 的情况下运行 Junit 集成测试!

标签: java jdbc jndi


【解决方案1】:

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

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

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

更新:从您发布的代码 sn-p 看来,您正在尝试独立运行旨在在应用程序服务器中运行的代码。在这种情况下,代码试图从“电话簿”获取到数据库的连接。这是应用服务器容器中经常配置的资源之一。因此,您不必在代码中管理配置和与数据库的连接,而是可以在应用程序服务器中对其进行配置,然后在代码中简单地请求连接(使用 JNDI)。

【讨论】:

  • 我喜欢电话簿的类比。个人仍然对细节感到困惑,但你的回答给了我概念上的概述。
【解决方案2】:

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

没有时抛出此异常 初始上下文实现可以是 创建的。如何初始的政策 选择的上下文实现是 在文档中描述的 InitialContext 类。

如果您尽职尽责地查看 InitialContext 的 javadocs,它们会很好地描述初始上下文是如何构造的,以及您提供地址/凭据/等的选项。

如果您想创建上下文并在其他地方卡住,请回帖说明您到目前为止所做的工作以及您在哪里搁浅。

【讨论】:

    【解决方案3】:

    阅读the docs

    没有时抛出此异常 初始上下文实现可以是 创建的。如何初始的政策 选择的上下文实现是 在文档中描述的 InitialContext 类。

    这个异常可以在 与 InitialContext,不仅当 InitialContext 被构造。为了 例如,实施 初始上下文可能会懒惰地检索 仅当实际方法时的上下文 被调用。应用程序 不应该依赖于何时 初始上下文的存在是 确定。

    但这在InitialContext 的文档中得到了更好的解释

    【讨论】:

    • @Oracle:InitialContext 是一个非常愚蠢、毫无意义的名字。它是无言词initialcontext 的组合,可用于任何地方的任何事物。上面的段落也使用了8(八)次context这个词来解释InitialContext这个词。更好的名称是JavaNamingAndDirectoryInitialContext 或至少NamingAndDirectoryInitialContext。或者更好地重新考虑整个命名并给出有意义的名称。当然,JNDI 有点抽象,但我觉得 InitialContext 确实是个糟糕的选择。
    • 同意。但是您可能应该在甲骨文解决这种批评。你在这里射击信使
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2015-01-22
      • 2020-10-27
      • 2015-07-15
      • 2018-07-17
      • 2012-08-13
      • 2011-12-23
      • 2013-10-27
      相关资源
      最近更新 更多