Невозможно создать драйвер JDBC класса '' для соединительного URL 'null' - PullRequest
16 голосов
/ 01 сентября 2011

Я использую Tomcat 7.0.12 и получаю эту ошибку всякий раз, когда пытаюсь получить доступ к источнику данных JNDI, подключающемуся к базе данных postgresql через страницу .jsp в веб-приложении под названием 'ROOT':

SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception
[java.lang.RuntimeException: Cannot create JDBC driver of class '' for connect URL 'null'] with root cause
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)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

JDBC-драйвер postgresql находится в моей папке CATALINA / lib.

Вот мой META-INF / context.xml:

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

<Context>

<Resource name="jdbc/webdbro" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/webdb"
    username="webdbro" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

<Resource name="jdbc/webdbrw" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/webdb"
    username="webdbrw" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

<Resource name="jdbc/shadowdbro" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/shadowdb"
    username="shadowdbro" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

</Context>

Вот мой WEB-INF / web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ROOT</display-name>

<resource-ref>
    <description>Read only webdb connector.</description>
    <res-ref-name>jdbc/webdbro</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>Read write webdb connector.</description>
    <res-ref-name>jdbc/webdbrw</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>Read only shadow db connector.</description>
    <res-ref-name>jdbc/shadowdbro</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>

Странно то, что у меня есть 2 других веб-приложения, работающих на одном сервере Tomcat, использующих ту же конфигурацию (web.xml и context.xml), поэтому они могут использовать метод JNDI для подключения к базе данных.и ОБА из этих веб-приложений работают отлично - я могу запрашивать и обновлять базу данных без проблем или исключений в этих приложениях.ТИА ...

Ответы [ 3 ]

17 голосов
/ 02 сентября 2011

Чтобы все 3 веб-приложения правильно использовали один и тот же источник данных, мне пришлось переместить все мои записи <Resource> из папки META-INF / context.xml в папку $ CATALINA_BASE / conf / context.xml сервера. Не очень хорошее решение, но оно работает.

3 голосов
/ 27 марта 2014

У меня возникла та же проблема, и оказалось, что мое объявление <Resource> имени в context.xml не соответствует объявлению, определенному для <resource-ref> имени в web.xml.

2 голосов
/ 14 октября 2013

Как уже было сказано выше, одним из решений является перемещение записей в $ CATALINA_BASE / conf / context.xml

Другой подход описан здесь: http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/

В частности, «Скопируйте файл Context.xml в папку tomcat / conf / Catalina / localhost и переименуйте его в <web_app_name>.xml»

Основной причиной может быть проблема с правами доступа к файлу: «Пользователь, под которым работал tomcat, не имел разрешения на запись в эти папки. Поэтому мы изменили владельца группы папок tomcat и / etc / tomcat на та же группа, к которой принадлежал пользователь tomcat, и волшебным образом все начало работать как прежде. "

Это решение кажется мне «чище», потому что тогда вы можете поместить все ваше веб-приложение, включая свойства подключения к базе данных, в файл .war.

...