Tomcat: javax.naming.NoInitialContextException
Tomcat: javax.naming.NoInitialContextException
我在 Tomcat 服务器上有一个带有 Java Servlet 的网络服务。
在我的 Servlet 中,我使用这样的数据库池:
envContext = new InitialContext();
DataSource ds = (DataSource) envContext.lookup( "java:/comp/env/jdbc/Database" );
con = ds.getConnection();
为了初始化,我在 web.xml:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Database</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
然后是context.xml,这似乎是重要的步骤:
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for each web application -->
<Context crossContext="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/Database" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/configerror_db"/>
</Context>
我阅读了很多关于此错误的其他问题,但我无法解决。
首先我想解释一下,我 在使用我的 linux-机器时没有得到这个错误。因此,我在我的 Windows 机器上的 Eclipse 中安装了相同的代码,我得到了这个上下文环境错误。
其他答案说做this.
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"<initialContextFactory>");
env.put(Context.PROVIDER_URL, "<url>");
env.put(Context.SECURITY_PRINCIPAL, "<user>");
env.put(Context.SECURITY_CREDENTIALS, "<password>");
ctx = new InitialContext(env);
但我不知道 initialContextFactory 是什么 AND context.xml 不应该这样做吗?正如我在 linux 上所说,它有效。
有人可以帮我吗?我错过了什么?我不想在使用数据库连接的每个文件中都写上用户名和密码。我想地狱是的,这太棒了。凭据仅在 context.xml 中,但现在在 windows 中不起作用。
感谢任何建议。
您在 web.xml
和 context.xml
中的配置没有问题。没有必要通过代码填充 HashTable 等来重现它。
我已经成功地测试了类似的实验。问题可能很简单,因为 JNDI 中的斜线太多 url:试试这个:
DataSource ds = (DataSource) envContext.lookup( "java:comp/env/jdbc/Database" );
更新:
What is initialContextFactory and what it does?
Initial context factory
The constant that holds the name of the environment property for
specifying the initial context factory to use. The value of the
property should be the fully qualified class name of the factory class
that will create an initial context. This property may be specified in
the environment parameter passed to the initial context constructor,
an applet parameter, a system property, or an application resource
file.
如果未在任何这些来源中指定,则在需要初始上下文来完成操作时抛出 NoInitialContextException
。
这个常量的值为"java.naming.factory.initial"
。
更多详情:可以关注这个tutorial。
服务器管理员工作区:
当服务器管理员创建数据源时,他将其与配置为访问特定供应商数据库的 Java 数据库连接 (JDBC) 提供程序相关联。应用程序服务器需要这两个对象,您的应用程序才能调用该特定数据库并从中接收数据。 数据源提供连接管理功能,使您的应用程序和数据库之间的这些交换在物理上成为可能。
新创建的数据源的服务器 has to be restarted
可供应用程序 Java Naming and Directory Interface (JNDI)
使用。
在服务器配置中,有一个名为jndi name
的选项。服务器管理员在 JNDI name field
中输入 Java Naming and Directory Interface (JNDI) name
。应用程序服务器使用 JNDI 名称将应用程序的资源引用绑定到此数据源。
注意:
- 不要在不同的资源类型之间分配重复的 JNDI 名称,
例如数据源与 J2C 连接工厂或 JMS
连接工厂。
- 不要为多个资源分配重复的 JNDI 名称
同一范围内的同一类型。
资源Link:
Configuring a data source using the administrative console
开发人员工作区:
配置和 运行 JNDI Datasource Connection pool
任何 Java Web 应用程序的三个步骤:
- 在服务器中配置数据源并创建 JNDI 名称。
- 配置web.xml
- 使用 JNDI 数据源配置您的 bean
- 在服务器库中包含 JDBC 驱动程序库
给出了数据库明智的配置和代码here。
资源Link:
正如@BalusC先生所说,
Exception strongly suggests that JNDI is disabled on Tomcat instance.
所以启用JNDI,你可以获得很多教程。
可以在 here.
中找到有关启用 JNDI 的详细说明,并附有示例
有关更多信息,您也可以通过此 tutorial。
资源Link:
你好 progNewbie,
我正在 Windows OS
和 Eclipse IDE
工作,特别是在您正在寻找的相同类型的项目上。
您需要在以下地方更新您的代码(3-更改)...
1.执行以下 Java 更改,
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
......
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/Database");
conn = ds.getConnection();
2。配置 Java Web 应用程序的 web.xml 同样,
......
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Database</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
.........
3。在 Tomcat 的 server.xml 文件中进行以下更改:
..................
<!-- Assume my application runs on localhost... -->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className=..../>
<Context docBase="...." path="..." reloadable="true" source=".....">
<!-- Assume i am using Oracle Database so that driverClass(below) Attribute's Value will be oracle.jdbc.driver.OracleDriver -->
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/Database" password="db-password"
type="javax.sql.DataSource" url="db-connection-url" username="db-user-name"
/>
</Context>
</Host>
............
已编辑:
让我知道是否仍然卡住了。
我在 Tomcat 服务器上有一个带有 Java Servlet 的网络服务。 在我的 Servlet 中,我使用这样的数据库池:
envContext = new InitialContext();
DataSource ds = (DataSource) envContext.lookup( "java:/comp/env/jdbc/Database" );
con = ds.getConnection();
为了初始化,我在 web.xml:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Database</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
然后是context.xml,这似乎是重要的步骤:
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for each web application -->
<Context crossContext="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/Database" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/configerror_db"/>
</Context>
我阅读了很多关于此错误的其他问题,但我无法解决。
首先我想解释一下,我 在使用我的 linux-机器时没有得到这个错误。因此,我在我的 Windows 机器上的 Eclipse 中安装了相同的代码,我得到了这个上下文环境错误。
其他答案说做this.
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"<initialContextFactory>");
env.put(Context.PROVIDER_URL, "<url>");
env.put(Context.SECURITY_PRINCIPAL, "<user>");
env.put(Context.SECURITY_CREDENTIALS, "<password>");
ctx = new InitialContext(env);
但我不知道 initialContextFactory 是什么 AND context.xml 不应该这样做吗?正如我在 linux 上所说,它有效。
有人可以帮我吗?我错过了什么?我不想在使用数据库连接的每个文件中都写上用户名和密码。我想地狱是的,这太棒了。凭据仅在 context.xml 中,但现在在 windows 中不起作用。
感谢任何建议。
您在 web.xml
和 context.xml
中的配置没有问题。没有必要通过代码填充 HashTable 等来重现它。
我已经成功地测试了类似的实验。问题可能很简单,因为 JNDI 中的斜线太多 url:试试这个:
DataSource ds = (DataSource) envContext.lookup( "java:comp/env/jdbc/Database" );
更新:
What is initialContextFactory and what it does?
Initial context factory
The constant that holds the name of the environment property for specifying the initial context factory to use. The value of the property should be the fully qualified class name of the factory class that will create an initial context. This property may be specified in the environment parameter passed to the initial context constructor, an applet parameter, a system property, or an application resource file.
如果未在任何这些来源中指定,则在需要初始上下文来完成操作时抛出 NoInitialContextException
。
这个常量的值为"java.naming.factory.initial"
。
更多详情:可以关注这个tutorial。
服务器管理员工作区:
当服务器管理员创建数据源时,他将其与配置为访问特定供应商数据库的 Java 数据库连接 (JDBC) 提供程序相关联。应用程序服务器需要这两个对象,您的应用程序才能调用该特定数据库并从中接收数据。 数据源提供连接管理功能,使您的应用程序和数据库之间的这些交换在物理上成为可能。
新创建的数据源的服务器 has to be restarted
可供应用程序 Java Naming and Directory Interface (JNDI)
使用。
在服务器配置中,有一个名为jndi name
的选项。服务器管理员在 JNDI name field
中输入 Java Naming and Directory Interface (JNDI) name
。应用程序服务器使用 JNDI 名称将应用程序的资源引用绑定到此数据源。
注意:
- 不要在不同的资源类型之间分配重复的 JNDI 名称, 例如数据源与 J2C 连接工厂或 JMS 连接工厂。
- 不要为多个资源分配重复的 JNDI 名称 同一范围内的同一类型。
资源Link:
Configuring a data source using the administrative console
开发人员工作区:
配置和 运行 JNDI Datasource Connection pool
任何 Java Web 应用程序的三个步骤:
- 在服务器中配置数据源并创建 JNDI 名称。
- 配置web.xml
- 使用 JNDI 数据源配置您的 bean
- 在服务器库中包含 JDBC 驱动程序库
给出了数据库明智的配置和代码here。
资源Link:
正如@BalusC先生所说,
Exception strongly suggests that JNDI is disabled on Tomcat instance.
所以启用JNDI,你可以获得很多教程。
可以在 here.
中找到有关启用 JNDI 的详细说明,并附有示例有关更多信息,您也可以通过此 tutorial。
资源Link:
你好 progNewbie,
我正在 Windows OS
和 Eclipse IDE
工作,特别是在您正在寻找的相同类型的项目上。
您需要在以下地方更新您的代码(3-更改)...
1.执行以下 Java 更改,
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
......
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/Database");
conn = ds.getConnection();
2。配置 Java Web 应用程序的 web.xml 同样,
......
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Database</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
.........
3。在 Tomcat 的 server.xml 文件中进行以下更改:
..................
<!-- Assume my application runs on localhost... -->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className=..../>
<Context docBase="...." path="..." reloadable="true" source=".....">
<!-- Assume i am using Oracle Database so that driverClass(below) Attribute's Value will be oracle.jdbc.driver.OracleDriver -->
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/Database" password="db-password"
type="javax.sql.DataSource" url="db-connection-url" username="db-user-name"
/>
</Context>
</Host>
............
已编辑:
让我知道是否仍然卡住了。