Impossible de créer un pilote JDBC de classe ” pour l’URL de connexion ‘null’: je ne comprends pas cette exception

Pourquoi dit-il l’ URL null et donne une classe ” vide dans l’exception quand j’ai fourni l’URL de la firebase database?

J’essaie de me connecter à la firebase database derby via un servlet lors de l’utilisation de Tomcat . Lorsque le servlet est exécuté, 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 { // Ssortingng querySsortingng = request.getQuerySsortingng(); 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 Ssortingng 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:

  

et ceci dans web.xml :

   my connection jdbc/PollDatasource javax.sql.DataSource Container 

Où est-ce que je me trompe?

Image qui montre l’URL de la firebase database.

entrer la description de l'image ici

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

Je ne vois rien de manifestement faux, mais une approche différente pourrait peut-être vous aider à la déboguer?

Vous pouvez essayer de spécifier votre source de données dans le contexte par application au lieu de celui de tomcat global.

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épertoire maven standard – 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 à quelque chose comme:

     

De toute évidence, le chemin et docBase devront correspondre aux détails spécifiques de votre application.

Avec 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 firebase database, votre approche est plus logique.

En tout cas, faites-en 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.

Plusieurs correctifs:

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

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

  3. Ne mettez rien dans le conf/context.xml de Tomcat: il n’y a vraiment aucune raison de le faire. Au lieu de cela, utilisez META-INF/context.xml pour définir votre .

L’erreur "Cannot create JDBC driver of class '' for connect URL 'null' se produit généralement parce que le pilote JDBC n’est pas au bon endroit (ou à trop d’endroits, comme lib/ Tomcat lib/ WEB-INF/lib/ Webapp WEB-INF/lib/ directory) Vérifiez que vous avez le bon fichier JAR de pilotes au bon endroit.

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 de syntaxe réseau.

À l’inverse, si vous utilisez la syntaxe réseau, vous devez utiliser ClientDriver.

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

J’ai eu ce problème parce que je mets context.xml dans le mauvais chemin:

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

Le bon chemin était:

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

Si vous utilisez eclipse, vous devez modifier le context.xml à partir du projet de serveur créé dans votre explorateur de paquet eclipse. Lorsque vous utilisez tomcat dans éclipse, il est le seul valide, les autres sont ignorés ou remplacés

Dans mon cas, j’ai résolu le problème lors de la modification de [tomcat] / Catalina / localhost / [mywebapp_name] .xml au lieu de META-INF / context.xml.

Context envContext = (Context)initContext.lookup("java:comp/env");

pas: Context envContext = (Context)initContext.lookup("java:/comp/env");

Avez-vous essayé de spécifier la ressource uniquement dans context.xml

  

et supprimer la section de web.xml ?

Dans un projet, j’ai vu la configuration sans section dans web.xml et cela a fonctionné.

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

Si vous utilisez un pilote intégré, connectSsortingng est juste

 jdbc:derby:databaseName 

(avec les options comme; create = true; user = xxx, etc.).

Si vous utilisez un pilote client, la chaîne de connexion peut être laissée telle quelle, mais si le changement de pilote ne donne aucun résultat … excusez la question, mais êtes-vous sûr à 100% d’avoir démarré le Derby Network Server? ?

J’ai eu un problème similaire en utilisant Tomcat contre Oracle. J’ai le contexte.xml dans le répertoire META-INF, sur le 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 cela aide quelqu’un.

Essayez de bash F5 en éclipse