web-dev-qa-db-ja.com

接続URL'null 'のクラス' 'のJDBCドライバーを作成できません

私はTomcat7.0.12を使用しており、「ROOT」というWebアプリケーションの.jspページを介してpostgresqlデータベースに接続するJNDIデータソースにアクセスしようとすると、このエラーが発生します。

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)

PostgresqlJDBCドライバーは私の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>

奇妙なことに、まったく同じ設定(web.xmlとcontext.xml)を使用して同じTomcatサーバーで2つの他のWebアプリケーションを実行しているため、JNDIメソッドを使用してデータベースに接続でき、これらのWebアプリケーションの両方が完全に機能します。 -これらのアプリで問題や例外なしにデータベースをクエリおよび更新できます。 TIA.。

16
MuffinMan

3つのWebアプリすべてで同じデータソースを適切に使用するには、すべての<Resource>エントリをMETA-INF/context.xmlフォルダーからサーバーの$ CATALINA_BASE/conf /context.xmlフォルダーに移動する必要がありました。優れたソリューションではありませんが、機能します。

17
MuffinMan

同じ問題が発生していましたが、context.xmlの<Resource>名の宣言が、web.xmlの<resource-ref>名で定義されたものと一致しなかったことが判明しました。

3
robvelor

上で答えたように、1つの解決策は、エントリを$ 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ユーザーが所属していて、魔法のようにすべてが以前と同じように機能し始めました。」

このソリューションは、データベース接続プロパティを含むWebアプリ全体を.warファイルにラップできるため、私には「よりクリーン」に思えます。

2
Mark