Imansible creare il driver JDBC di class ” per l”URL di connessione’ null ‘: non capisco questa eccezione

Perché dice un URL nullo e fornisce una “class” vuota nell’eccezione quando ho fornito l’URL del database?

Provo a connettermi al database di derby tramite un servlet mentre utilizzo Tomcat . Quando viene eseguito il servlet, ottengo le seguenti eccezioni:

 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(); } } 

}

Che eccezione è questa? Qual è la ragione per cui ottengo questa eccezione?

Ho aggiunto il seguente tag in context.xml di Tomcat:

  

e questo in web.xml :

   my connection jdbc/PollDatasource javax.sql.DataSource Container 

Dove sto facendo un errore?

Immagine che mostra l’URL del database ..

inserisci la descrizione dell'immagine qui

NOTA: dopo la risposta di @Bryan Pendleton ho cambiato il driver in org.apache.derby.jdbc.ClientDriver ma ottengo la stessa eccezione.

Non riesco a vedere nulla di evidentemente sbagliato, ma forse un approccio diverso potrebbe aiutarti a eseguirne il debugging?

Si potrebbe provare a specificare la propria origine dati nel contesto per applicazione invece di quello globale di tomcat.

Puoi farlo creando un src / main / webapp / META-INF / context.xml (presumo che tu stia usando la struttura standard della directory di maven – se no, allora la cartella META-INF dovrebbe essere una sorella della tua Directory WEB-INF). Il contenuto del file META-INF / context.xml sarà simile al seguente:

     

Ovviamente il percorso e docBase dovrebbero corrispondere ai dettagli specifici della tua applicazione.

Utilizzando questo approccio, non è necessario specificare i dettagli dell’origine dati nel file context.xml di Tomcat. Sebbene, se hai più applicazioni che parlano allo stesso database, il tuo approccio ha più senso.

Ad ogni modo, dai un vortice e vedi se fa alcuna differenza. Potrebbe darci un indizio su cosa non va nel tuo approccio.

Diverse correzioni:

  1. Usa il giusto nome della class del driver per il tuo ambiente: se stai usando un server Derby fuori processo, allora vuoi ClientDriver (e devi usare derbyclient.jar), il nome host e la porta, ecc. Se vuoi un elaborare il server Derby, quindi si desidera derby.jar, EmbeddedDriver e un URL appropriato per un database incorporato.

  2. Metti il ​​tuo file JAR del driver solo nella cartella lib/ Tomcat.

  3. Non inserire nulla in conf/context.xml di Tomcat: non c’è davvero alcun motivo. Invece, usa META-INF/context.xml tuo webapp per definire la tua .

L’errore "Cannot create JDBC driver of class '' for connect URL 'null' solito si verifica perché il driver JDBC non è nel posto giusto (o in troppe posizioni, come la directory lib/ Tomcat ma anche nel WEB-INF/lib/ webapp WEB-INF/lib/ directory). Verifica di avere il file JAR del driver giusto nel posto giusto.

Queste due cose non corrispondono:

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

Se si utilizza EmbeddedDriver, l’URL non deve contenere la syntax di rete.

Al contrario, se si utilizza la syntax di rete, è necessario utilizzare ClientDriver.

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

Stavo ricevendo questo problema perché ho inserito context.xml nel percorso sbagliato:

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

Il percorso corretto era:

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

Se si sta utilizzando eclipse, è necessario modificare il context.xml dal progetto server creato nel pacchetto eclipse explorer. Quando si utilizza tomcat in eclipse, è l’unico valido, gli altri vengono ignorati o sovrascritti

Nel mio caso ho risolto il problema modificando [tomcat] / Catalina / localhost / [mywebapp_name] .xml invece di META-INF / context.xml.

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

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

Hai provato a specificare la risorsa solo in context.xml

  

e rimuovere la sezione da web.xml ?

In un progetto ho visto la configurazione senza la sezione in web.xml e ha funzionato.

È un’ipotesi jdbc/PollDatasource , ma penso che la dichiarazione della risorsa JNDI denominata jdbc/PollDatasource in web.xml possa sovrascrivere la dichiarazione di risorsa con lo stesso nome in context.xml e la dichiarazione in web.xml manchi sia driverClassName che url quindi gli NPE per tali proprietà.

Se stai utilizzando un driver incorporato, connectString è solo

 jdbc:derby:databaseName 

(con opzioni come; create = true; user = xxx etc).

Se stai usando un driver client, la stringa di connessione può essere lasciata così com’è, ma se la modifica del driver non dà risultati … scusa la domanda, ma sei sicuro al 100% di aver avviato il Derby Network Server come da Derby Tutorial ?

Ho avuto un problema simile con Tomcat contro Oracle. Ho avuto il context.xml nella directory META-INF, sul disco. Tuttavia, questo file non veniva mostrato nel progetto eclipse. Un semplice colpo sull’aggiornamento F5 e il file context.xml apparso e Eclipse l’ha pubblicato. Tutto ha funzionato oltre quello. Spero che questo aiuti qualcuno.

Prova a colpire F5 in eclipse