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

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

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

如果无法创建初始上下文实现,则抛出此exception。 InitialContext类的文档中描述了如何选择初始上下文实现的策略。

如果你尽职地看看InitialContext的javadoc,它们很好地描述了如何构造初始上下文,以及你提供地址/凭证等的选项。

如果你有创建上下文并陷入其他地方,请回复解释你到目前为止所做的事情以及你在哪里搁浅。

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

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

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

更新:从您发布的代码片段看起来您正在尝试运行代码独立,这意味着要在应用程序服务器中运行。 在这种情况下,代码试图从“电话簿”获得与数据库的连接。 这是通常在应用程序服务器容器中配置的资源之一。 因此,您可以在应用程序服务器中配置它并简单地在代码中请求连接(使用JNDI),而不必在代码中管理数据库的配置和连接。

只需阅读文档 :

如果不能创建初始上下文实现,则抛出此exception。 InitialContext类的文档中描述了如何选择初始上下文实现的策略。

在与InitialContext进行任何交互时,不仅在构造InitialContext时,都会抛出此exception。 例如,初始上下文的实现可能仅在对其调用实际方法时才会懒惰地检索上下文。 应用程序不应该确定何时确定初始上下文的存在。

但是在InitialContext的文档中解释得更好

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