2011-09-01 12 views
15

Estoy usando Tomcat 7.0.12 y recibiendo este error cada vez que intenté acceder a un origen de datos JNDI conectando a un db postgresql a través de una página .jsp en una aplicación web llamado 'ROOT':No se puede crear el controlador JDBC de la clase '' para conectar la URL 'nulo'

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) 

El driver JDBC postgresql está en mi carpeta CATALINA/lib.

Aquí es mi 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> 

Aquí está mi 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> 

Lo extraño es que tengo otras 2 aplicaciones web ejecutándose en el mismo servidor Tomcat usando exactamente la misma configuración (web.xml y context.xml) para que puedan usar el método JNDI para conectarse a la base de datos y AMBAS de esas aplicaciones web funcionan perfectamente bien - Puedo consultar y actualizar la base de datos sin problemas o excepciones en esas aplicaciones. TIA ...

+0

La excepción dice que Tomcat no ha leído/encontrado el '' que ha configurado. ¿Estás ejecutando la aplicación web desde dentro de Eclipse o algo así? – BalusC

Respuesta

17

Para que los 3 webapps utilicen la misma fuente de datos correctamente, tuve que mover todas mis entradas <Resource> de la carpeta META-INF/context.xml al contexto $ CATALINA_BASE/conf/del servidor. carpeta xml No es una gran solución, pero funciona.

+0

Las actualizaciones de su context.xml no surten efecto en $ CATALINA_BASE/conf/context.xml a menos que vuelva a implementar la aplicación web o las aplique usted mismo en esa carpeta. – EJP

+0

Gracias. Después de 6 horas de buscar la causa de esto, tu solución funciona. – Hafnernuss

2

como respondida anteriormente, una solución consiste en mover las entradas a $ CATALINA_BASE/conf/context.xml

Otro enfoque se describe aquí: http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/

En particular, "Copia el archivo context.xml a la carpeta tomcat/conf/Catalina/localhost y cambiarle el nombre a <web_app_name>.xml "

La causa subyacente podría deberse a un problema con los permisos de archivo:" El usuario bajo el cual se estaba ejecutando tomcat no tenía permiso para escribir en estas carpetas. Entonces cambiamos el grupo propietariohi p de tomcat y la carpeta/etc/tomcat al mismo grupo al que pertenecía el usuario de tomcat y mágicamente todo comenzó a funcionar como antes ".

Esta solución me parece más 'limpia' porque puede hacer que toda su aplicación web, incluidas las propiedades de conexión a la base de datos, esté envuelta en un archivo .war.

3

Estaba teniendo el mismo problema y resultó que mi declaración de nombre <Resource> en context.xml no coincidía con la definida en <resource-ref> nombre en web.xml.

Cuestiones relacionadas