Java 无法创建类';的JDBC驱动程序';用于连接URL';空';:我不理解这个例外

Java 无法创建类';的JDBC驱动程序';用于连接URL';空';:我不理解这个例外,java,jakarta-ee,tomcat,jndi,derby,Java,Jakarta Ee,Tomcat,Jndi,Derby,当我提供了数据库URL时,为什么它会说空URL并在异常中给出空的“”类? 我试图在使用Tomcat时通过servlet连接到derby数据库。当servlet运行时,会出现以下异常: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.c

当我提供了数据库URL时,为什么它会说空URL并在异常中给出空的“”类?

我试图在使用Tomcat时通过servlet连接到derby数据库。当servlet运行时,会出现以下异常:

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 servlets.servlet_1.doGet(servlet_1.java:23) // ---> Marked the statement in servlet

at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:507)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:476)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
at java.sql.DriverManager.getDriver(DriverManager.java:253)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 24 more
Servlet:

这是什么例外?为什么我会得到这个例外

我在Tomcat的
context.xml
中添加了以下标记:

<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource"
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail"
maxActive="20" maxIdle="10" maxWait="-1" />
我哪里出错了

显示数据库URL的图像


注意:@Bryan Pendleton回答后,我将驱动程序更改为
org.apache.derby.jdbc.ClientDriver
,但我得到了相同的异常。
Context-envContext=(Context)initContext.lookup(“java:comp/env”)


不是:
Context-envContext=(Context)initContext.lookup(“java:/comp/env”)

这两件事不匹配:

driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll database;create=true"
如果您使用的是EmbeddedDriver,则URL不应包含网络语法

相反,如果使用网络语法,则需要使用ClientDriver


是否仅在
context.xml


并从
web.xml
中删除
部分

在一个项目中,我在
web.xml
中看到了没有
部分的配置,它成功了


这是一个有根据的猜测,但是我认为
web.xml
中声明
JNDI
名为
jdbc/PollDatasource
的资源可能会覆盖
context.xml
中同名资源的声明,而
web.xml
中的声明同时缺少
drivercassname
url
,因此,NPE是这样做的属性。

如果您使用的是嵌入式驱动程序,则connectString只是

jdbc:derby:databaseName 
(其中的选项有:create=true;user=xxx等)


如果您使用的是客户机驱动程序,连接字符串可以保持原样,但是如果更改驱动程序没有结果。。。请原谅这个问题,但是您是否100%确定您已经按照启动了Derby网络服务器?

我看不出有任何明显的错误,但也许另一种方法可以帮助您调试它

您可以尝试在每个应用程序上下文而不是全局tomcat上下文中指定数据源

您可以通过创建src/main/webapp/META-INF/context.xml来实现这一点(我假设您使用的是标准的maven目录结构——如果不是,那么META-INF文件夹应该是您的WEB-INF目录的同级目录)。META-INF/context.xml文件的内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<Context [optional other attributes as required]>

<Resource name="jdbc/PollDatasource" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.apache.derby.jdbc.ClientDriver"
          url="jdbc:derby://localhost:1527/poll_database;create=true"
          username="suhail" password="suhail" maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>

显然,路径和docBase需要与应用程序的特定细节相匹配

使用这种方法,您不必在Tomcat的context.xml文件中指定数据源细节。尽管如此,如果您有多个应用程序与同一个数据库通信,那么您的方法更有意义

无论如何,试一下,看看有没有什么不同。这可能会给我们一个线索,告诉我们您的方法出了什么问题。

有几种修复方法:

  • 为您的环境使用正确的驱动程序类名:如果您使用的是进程外Derby服务器,那么您需要ClientDriver(并且需要使用derbyclient.jar)、主机名和端口等。如果您需要进程内Derby服务器,那么您需要Derby.jar、EmbeddedDriver和适合嵌入式数据库的URL

  • 将驱动程序JAR文件仅放在Tomcat的
    lib/
    目录中

  • 不要把任何东西放在Tomcat的
    conf/context.xml
    :这真的没有理由。相反,使用你的webapp的
    META-INF/context.xml
    来定义你的


  • 由于JDBC驱动程序不在正确的位置(或在太多的位置,如Tomcat的
    lib/
    目录中,但也在webapp的
    WEB-INF/lib/
    目录中),通常会出现“无法为连接URL'null'创建类''的JDBC驱动程序”错误。请验证您是否在正确的位置拥有正确的驱动程序JAR文件。

    在我的例子中,我解决了编辑[tomcat]/Catalina/localhost/[mywebapp_name]时出现的问题.xml而不是META-INF/context.xml。

    如果您使用的是eclipse,您应该从eclipse包资源管理器中创建的服务器项目中修改context.xml。在eclipse中使用tomcat时,它是唯一有效的,其他的都被忽略或覆盖

    我在使用tomcat对抗Oracle时遇到了类似的问题。我确实有context.xml在META-INF目录中,在光盘上。但是这个文件没有显示在eclipse项目中。只需点击F5刷新和context.xml文件,eclipse就发布了它。所有的工作都完成了。希望这对其他人有所帮助


    尝试在eclipse中按F5

    我遇到了这个问题,因为我将
    context.xml
    放在了错误的路径中:

    ./src/main/resources/META-INF/context.xml
    
    正确的路径是:

    ./src/main/webapp/META-INF/context.xml
    

    问题还可能是因为Tomcat安装目录中缺少
    SQL驱动程序

    我必须在
    apache-tomcat-9.0.12/lib/
    文件夹中设置
    mysql-connector-java-5.1.23-bin.jar


    我认为连接URL丢失。@SuhailGupta我们在问题上得到标志,表明它是重复的。有时我们会错误地处理它们。这种情况会发生。我们在可以修复的地方修复它,然后在这里修复它。没有理由再对这个问题发表评论。您的JDBC驱动程序.jar文件在哪里?@Christopher Schultz您实际上在做什么ean by
    JDBC
    driver?我有一个驱动程序可以连接到tomcat的lib文件夹中的derby数据库。我的意思是:“你的JDBC driver.jar文件在哪里?”?“您说它在Tomcat的
    lib
    目录中。那很好。你在别的地方有吗?您是否有进程外Derby数据库?德比通常在过程中使用。这是一个
    <?xml version="1.0" encoding="UTF-8"?>
    
    <Context [optional other attributes as required]>
    
    <Resource name="jdbc/PollDatasource" auth="Container"
              type="javax.sql.DataSource" driverClassName="org.apache.derby.jdbc.ClientDriver"
              url="jdbc:derby://localhost:1527/poll_database;create=true"
              username="suhail" password="suhail" maxActive="20" maxIdle="10" maxWait="-1"/>
    </Context>
    
    ./src/main/resources/META-INF/context.xml
    
    ./src/main/webapp/META-INF/context.xml