web-dev-qa-db-fra.com

Impossible de créer le pilote JDBC de la classe '' pour l'URL de connexion 'null': je ne comprends pas cette exception

Pourquoi dit-on null URL et donne une classe '' vide dans l'exception quand j'ai fourni l'URL de la base de données?

J'essaie de me connecter à la base de données derby via un servlet tout en utilisant Tomcat. Lorsque la servlet est exécutée, j'obtiens les exceptions suivantes:

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:

package servlets;

import Java.io.IOException;
import Java.sql.Connection;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.*;
import javax.servlet.*;
import javax.sql.DataSource;

public class servlet_1 extends HttpServlet{

@Override 
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
    try {
       // String queryString = request.getQueryString();
        System.out.println("!!!!!!!!!!!!!!!!!!!");
        Context initContext = new InitialContext();
        Context envContext = (Context)initContext.lookup("Java:comp/env");
        DataSource ds = (DataSource)envContext.lookup("jdbc/PollDatasource");
        Connection connection = ds.getConnection(); // -->LINE 23
        String sqlQuery = "select * from PollResult";
        PreparedStatement statement = connection.prepareStatement(sqlQuery);
        ResultSet set = statement.executeQuery();
        System.out.println("after the final statement");
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}

}

Quelle exception est-ce? Quelle est la raison pour laquelle je reçois cette exception?

J'ai ajouté la balise suivante dans context.xml de Tomcat:

<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" />

et ceci dans web.xml:

   <resource-ref>
<description>my connection</description>
<res-ref-name>jdbc/PollDatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

Où est-ce que je fais une erreur?

Image qui montre l'URL de la base de données ..

enter image description here

NOTE: Après la réponse de @Bryan Pendleton, j'ai changé le pilote en org.Apache.derby.jdbc.ClientDriver mais j'ai la même exception.

41
Suhail Gupta

Je ne vois rien de mal en apparence, mais une approche différente pourrait-elle vous aider à le déboguer?

Vous pouvez essayer de spécifier votre source de données dans le contexte par application plutôt que dans le contexte global Tomcat.

Vous pouvez le faire en créant un fichier src/main/webapp/META-INF/context.xml (je suppose que vous utilisez la structure de répertoires standard maven - sinon, le dossier META-INF doit être un frère de votre Répertoire WEB-INF). Le contenu du fichier META-INF/context.xml ressemblerait à ceci:

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

<Context path="/myApp" docBase="myApp"
   crossContext="true" reloadable="true" debug="1">

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

Il est évident que le chemin d'accès et la base de données docBase doivent correspondre aux détails spécifiques de votre application.

En utilisant cette approche, vous n'avez pas besoin de spécifier les détails de la source de données dans le fichier context.xml de Tomcat. Bien que, si plusieurs applications communiquent avec la même base de données, votre approche est plus logique.

Quoi qu'il en soit, faites un tourbillon et voyez si cela fait une différence. Cela pourrait nous donner une idée de ce qui ne va pas avec votre approche.

28
Taskmaster

Plusieurs correctifs:

  1. Utilisez le bon nom de classe de pilote pour votre environnement: si vous utilisez un serveur Derby hors processus, vous voulez ClientDriver (et devez utiliser derbyclient.jar), le nom d’hôte et le port, etc. serveur Derby, vous souhaitez alors derby.jar, EmbeddedDriver et une URL appropriée pour une base de données intégrée.

  2. Placez votre fichier JAR de pilote uniquement dans le répertoire lib/ de Tomcat.

  3. Ne mettez rien dans le conf/context.xml de Tomcat: il n'y a vraiment aucune raison pour cela. Utilisez plutôt le META-INF/context.xml de votre application Web pour définir votre <Resource>.

L'erreur "Cannot create JDBC driver of class '' for connect URL 'null' se produit généralement car le pilote JDBC n'est pas au bon endroit (ou trop souvent, comme le répertoire lib/ de Tomcat, mais également dans le répertoire WEB-INF/lib/ de l'application Web). Vérifiez que vous avez le bon fichier JAR du pilote au bon endroit.

7
Christopher Schultz

Ces deux choses ne correspondent pas:

driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll database;create=true"

Si vous utilisez EmbeddedDriver, votre URL ne doit pas contenir la syntaxe du réseau.

Inversement, si vous utilisez la syntaxe réseau, vous devez utiliser ClientDriver.

http://db.Apache.org/derby/docs/10.8/getstart/rgsquck35368.html

5
Bryan Pendleton

J'avais ce problème parce que j'ai mis context.xml dans le mauvais chemin:

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

Le bon chemin était:

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

Si vous utilisez Eclipse, vous devez modifier le fichier context.xml à partir du projet de serveur créé dans l'explorateur de packages Eclipse. Si vous utilisez Tomcat dans Eclipse, c’est le seul qui soit valide, les autres sont ignorés ou remplacés.

2
jesantana

J'ai eu un problème similaire en utilisant Tomcat contre Oracle. J'ai EST-CE QUE avait le fichier context.xml dans le répertoire META-INF du disque Ce fichier ne figurait cependant pas dans le projet Eclipse. Un simple coup sur l'actualisation F5 et le fichier context.xml est apparu et Eclipse l'a publié. Tout a fonctionné après ça. J'espère que ça aide quelqu'un.

Essayez de frapper F5 dans Eclipse

0
theINtoy

Dans mon cas, j'ai résolu le problème en modifiant [Tomcat]/Catalina/localhost/[nom_webapp] .xml au lieu de META-INF/context.xml.

0
Joaquim Perez

Le problème peut également provenir d’un manque de SQL driver dans votre répertoire d’installation Tomcat.

Je devais avoir mysql-connector-Java-5.1.23-bin.jar dans le dossier Apache-Tomcat-9.0.12/lib/.

https://dev.mysql.com/downloads/connector/j/

0
Dinath

Avez-vous essayé de spécifier une ressource uniquement dans 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" />

et supprimez la section <resource-ref> de web.xml?

Dans un projet, j'ai vu la configuration sans la section <resource-ref> dans web.xml et cela a fonctionné.

C'est une supposition éclairée, mais je pense que la déclaration <resource-ref> de la ressource JNDI nommée jdbc/PollDatasource dans web.xml peut remplacer la déclaration de ressource portant le même nom dans context.xml et que la déclaration dans web.xml manque à la fois de driverClassName et url, d'où les NPE pour ces propriétés.

0
Yura

Si vous utilisez un pilote intégré, connectString est simplement 

jdbc:derby:databaseName 

(avec des options telles que; create = true; utilisateur = xxx, etc.).

Si vous utilisez un pilote client, la chaîne de connexion peut être laissée telle quelle, mais si vous ne changez pas le pilote, excusez la question, mais êtes-vous sûr à 100% que vous avez démarré le serveur Derby Network Server conformément à le Derby Tutorial ?

0
pafau k.