首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tomcat: javax.naming.NoInitialContextException

Tomcat: javax.naming.NoInitialContextException
EN

Stack Overflow用户
提问于 2016-05-18 16:40:54
回答 3查看 5K关注 0票数 4

我在Tomcat服务器上有一个带有Java的with服务。在我的Servlet中,我使用了如下数据库池:

代码语言:javascript
运行
复制
envContext = new InitialContext();
DataSource ds = (DataSource) envContext.lookup( "java:/comp/env/jdbc/Database" );
con = ds.getConnection();

对于初始化,我的web.xml中有如下内容:

代码语言:javascript
运行
复制
<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,它似乎是重要的步骤:

代码语言:javascript
运行
复制
<?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中的相同代码,我得到了这个上下文环境错误。

其他答案说要做这。

代码语言:javascript
运行
复制
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是什么,难道不应该这样做吗?正如我在linux上所说的,它可以工作。

有人能帮我一下吗?我遗漏了什么?我不想在我使用数据库连接的每个文件中写入用户和密码。我以为这太棒了。凭据只是在context.xml中,但是现在它在窗口上不起作用。

谢谢你的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-02 11:03:42

嗨,progNewbie,

我正在Windows OSEclipse IDE上工作,特别是在您正在寻找的相同类型的项目上。

您需要在以下地方更新您的代码(3-更改).

1.执行以下Java更改,

代码语言:javascript
运行
复制
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.xml (同样, )

代码语言:javascript
运行
复制
......
  <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文件中执行以下更改:

代码语言:javascript
运行
复制
..................
<!-- 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>
............

编辑:

那就告诉我如果还活着的话。

票数 3
EN

Stack Overflow用户

发布于 2016-05-18 17:11:23

您在web.xmlcontext.xml中的配置是可以的。不需要通过填充HashTable之类的代码来再现它。

我已经成功地测试了类似的实验。问题可能很简单,因为您的JNDI url中有太多的斜杠:尝试如下:

代码语言:javascript
运行
复制
DataSource ds = (DataSource) envContext.lookup( "java:comp/env/jdbc/Database" ); 
票数 -1
EN

Stack Overflow用户

发布于 2016-06-01 09:00:49

更新:

initialContextFactory是什么?它是做什么的?

初始上下文工厂

用于指定要使用的初始上下文工厂的环境属性名称的常量。属性的值应该是将创建初始上下文的工厂类的完全限定类名。可以在传递给初始上下文构造函数、applet参数、系统属性或应用程序资源文件的环境参数中指定此属性。

如果这些源中没有指定NoInitialContextException ,则在完成操作所需的初始上下文时抛出

这个常量的值是"java.naming.factory.initial"

有关更多细节:您可以跟踪这个教程

服务器管理工作区:

当服务器管理员创建数据源时,他将其与配置为访问特定供应商数据库的(JDBC)提供程序相关联。应用服务器需要应用程序的两个对象来调用该特定数据库并从它接收数据。数据源提供了连接管理功能,从而使您的应用程序和数据库之间的这些交换成为可能。

新创建的数据源的服务器has to be restarted可用于来自应用程序的Java Naming and Directory Interface (JNDI)

在服务器配置中,有一个名为jndi name的选项。服务器管理员在JNDI name field中提供输入JNDI name field。应用服务器使用JNDI名称将应用程序的资源引用绑定到此数据源。

注意:

  1. 不要在不同的资源类型之间分配重复的JNDI名称,例如数据源与J2C连接工厂或工厂。
  2. 不要为同一范围内同一类型的多个资源分配重复的JNDI名称。

资源链接:

使用管理控制台配置数据源

发展商工作区:

有三个步骤可以为任何Java应用程序配置和运行JNDI Datasource Connection pool

  • 在Server中配置数据源并创建JNDI名称。
  • 配置web.xml
  • 使用JNDI Datasource配置bean
  • 在服务器库中包括JDBC驱动程序库

数据库的配置和代码给出了这里

资源链接:

  1. JNDI资源在Apche Tomcat 7中的用法
  2. 如何在Tomcat 6中配置MySQL DataSource

正如@BalusC先生所说,

异常强烈表示在Tomcat实例上禁用了JNDI。

因此,用于启用JNDI,您可以获得许多教程。

对于启用JNDI过程中发生的事情有一个更详细的解释,包括一个示例,可以找到这里

要了解更多信息,您也可以通过这个教程

资源链接:

  1. Tomcat DataSource JNDI示例
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37305545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档