java - 关于我的错误,如何在 tomcat 中配置 jndi?

标签 java tomcat jakarta-ee datasource jndi

我在 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>

我的 Controller 中的代码是:

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: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) at com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.getConnection(TmpNavDAOMySql.java:91) at com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateModels(TmpNavDAOMySql.java:114) at com.isys.common.navigation.dao.mysql.TmpNavDAOMySql.populateNavModules(TmpNavDAOMySql.java:19) at com.isys.common.navigation.dao.mysql.TmpNavDAOMySqlImpl.populateNavModules(TmpNavDAOMySqlImpl.java:11) at com.isys.common.navigation.controller.TmpNavGenerator.init(TmpNavGenerator.java:12) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4733) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) at org.apache.catalina.core.StandardService.start(StandardService.java:525) at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 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

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

最佳答案

查看异常的根本原因:

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 桥驱动程序中的错误。它应该更优雅地处理它,或者抛出一个更 self 解释的异常。

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

关于java - 关于我的错误,如何在 tomcat 中配置 jndi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6291286/

相关文章:

spring-boot - 让 Tomcat 7 在远程 CentOS 7.5 上运行

tomcat - 为什么 WsSessionListener.sessionCreated() 在嵌入的 tomcat 9 中发出 `AbstractMethodError`?

java - 将 EJB 注入(inject) JAX-RS(RESTful 服务)

java - 我能以某种方式解决 ResourceIterator 惰性的这一特定方面吗?

java - Bukkit 调度命令不起作用

java - 无法运行 setDefaultHostnameVerifier

java - 在 JSF 2 的 AjaxBehaviorEvent 中捕获 KeyCode

java - 重新分区后,Kafka 流不使用 serde

java - AJP 连接器和 Tomcat 8.5.54 之间的网关超时问题

java - 不支持的 major.minor 版本 52.0 错误