【问题标题】:How to configure jndi in tomcat regarding my errors?关于我的错误,如何在 tomcat 中配置 jndi?
【发布时间】:2011-09-11 14:06:06
【问题描述】:

我在 google 和 stackoverflow 上搜索了这个问题,有几个问题,但没有导致特定的解决方案和原因背后的原因。我正在 JSF 中做一个项目,我的项目的上下文在 C:\apache-tomcat-6.0.32\conf\Catalina\localhost\ 中定义。

在我的web.xml 中,我也有以下配置:

<context-param>
    <description>Database server name</description>
    <param-name>DATABASE</param-name>
    <param-value>MYSQL</param-value>
</context-param>
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/MySqlDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

现在这个项目的上下文文件如下:

<Context path="/SMS" debug="5" reloadable="true" crossContext="true">
    <Resource name="jdbc/MySqlDS" auth="Container"
        type="javax.sql.DataSource" removeAbandoned="true"
        removeAbandonedTimeout="30" maxActive="100"
        maxIdle="30" maxWait="10000" username="root"
        password=""
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/rosebud"/>
</Context>

我的控制器中的代码是:

InitialContext initialContext = new InitialContext();
Context envContext  = (Context)initialContext.lookup("java:/comp/env");
javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup("jdbc/MySqlDS"); 
java.sql.Connection conn = ds.getConnection();

这是我的堆栈跟踪:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: 无法创建类 '' 的 JDBC 驱动程序 对于连接 URL 'null' 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 在 com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.getConnection(TmpNavDAOMySql.java:91) 在 com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateModels(TmpNavDAOMySql.java:114) 在 com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateNavModules(TmpNavDAOMySql.java:19) 在 com.isys.common.navigation.dao.mysql.TmpNavDAOMySqlImpl.populateNavModules(TmpNavDAOMySqlImpl.java:11) 在 com.isys.common.navigation.controller.TmpNavGenerator.init(TmpNavGenerator.java:12) 在 org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173) 在 org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993) 在 org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420) 在 org.apache.catalina.core.StandardContext.start(StandardContext.java:4733) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardHost.start(StandardHost.java:840) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) 在 org.apache.catalina.core.StandardService.start(StandardService.java:525) 在 org.apache.catalina.core.StandardServer.start(StandardServer.java:754) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:595) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 来源)在 java.lang.reflect.Method.invoke(未知 来源)在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 造成的: java.lang.NullPointerException 在 sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(未知 来源)在 sun.jdbc.odbc.JdbcOdbcDriver.knownURL(未知 来源)在 sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(未知 来源)在 java.sql.DriverManager.getDriver(未知 来源)在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437) ... 24 更多

如果我从 eclipse 外部运行 tomcat 但从 eclipse 内部运行时失败,则配置工作正常。可能是什么原因?

【问题讨论】:

  • 现在当我在 Eclipse 中更改服务器设置时,我的所有项目都被删除了:(

标签: java tomcat jakarta-ee datasource jndi


【解决方案1】:

查看异常的根本原因:

Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    ... 24 more

这个 NPE 显然是 Sun JDBC ODBC 桥驱动程序中的一个错误。它应该更优雅地处理它,或者抛出一个更不言自明的异常。

但是 Tomcat 数据源管理器使用 Sun JDBC ODBC 桥接驱动程序而不是您在 @987654323 的 driverClassName 中指定的 MySQL JDBC 驱动程序本身就是一个更大的问题@!这意味着 Tomcat 根本没有正确找到/解释 &lt;Resource&gt;。您应该将 context.xml 文件放在 your webapp 的 /META-INF 文件夹中。或者您应该将&lt;Resource&gt; 放在tomcat/conf/context.xml 文件的&lt;Context&gt; 中。

【讨论】:

  • 实际上该项目有它单独的“myapp.xml”,我在 apache-tomcat-6.0.32\conf\Catalina\localhost\ 中提到,如果不是从 Eclipse 部署 tomcat 即如果我部署来自 Eclipse IDE 外部的应用程序,但不是来自 IDE 内部的应用程序。当我从 Eclipse 启动 TOMCAT 时,它删除了文件夹中的配置文件,现在它也删除了项目。如果您能在其中提供一些清晰的内容,我会很高兴。因为我也在其他线程中查看了您以前的解决方案,但无法理解:(。
  • 正如我所回答的,它必须进入 webapp 的/META-INF/context.xml。如果文件和文件夹不存在,您可以自己创建。
  • 是的!我明白了,但为什么从外部 IDE 部署时它可以工作?
  • 因为 Eclipse 默认使用工作区元数据空间来部署 webapp。您需要重新配置 Eclipse 以改用 Tomcat 安装位置。在 Eclipse 中双击 Tomcat 以获取服务器配置,在 Server Locations 部分中,您应该选择 Use Tomcat Installation。
  • 使用工作区元数据时,您应该编辑 Eclipse 的 Servers 项目中的文件,而不是 Tomcat 本身中的文件。 Eclipse 即不会使用它们。为此,您应该将 Eclipse 配置为使用 Tomcat 安装,如上一条评论中所述。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 2013-06-10
  • 2017-09-17
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多