Newsgroup: it.comp.java
Titolo: Cannot create JDBC driver of class '' for connect URL 'null'....soluzione?

Salve ragazzi,
mi è capitato questo strano problema e ho visto che su internet
esistono migliaia di richieste quasi tutte senza una soluzione
concreta.
Sto realizzando un'applicazione in jsf che interagisce con Mysql 5.0 e
uso Eclipse con server Tomcat. Mentre vado a fare l'upload di un file
(premetto che il tutto funzioanava egregiamente senza pool di
connessioni, ora ho provato ad utilizzare il pool e JNDI,ma ho questo
errore) utilizzando le DBCP relative al server Tomcat è:
codice:
GRAVE: #{MyBean.carica}: javax.faces.el.EvaluationException:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver
of class '' for connect URL 'null'
javax.faces.FacesException: #{MyBean.carica}:
javax.faces.el.EvaluationException:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver
of class '' for connect URL 'null'
	at
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:78)
	at javax.faces.component.UICommand.broadcast(UICommand.java:312)
	at
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	at
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	at
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	at
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver
of class '' for connect URL 'null'
	at
com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:130)
	at
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72)
	... 34 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create
JDBC driver of class '' for connect URL 'null'
	at
org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
	at
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
	at giu.MyBean.carica(MyBean.java:185)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at
com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:126)
	... 35 more
Caused by: java.sql.SQLException: No suitable driver
	at java.sql.DriverManager.getDriver(Unknown Source)
	at
org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
	... 42 more
L'errore mi manda completamente nel pallone e non so come risolverlo,
nei forum ho trovato per ora solo mezze soluzioni,qualcuno sa aiutarmi?
Vi posto parte del server.xml di Tomcat,cioè quella da me modificata
secondo il JNDI Datasource How-To .La mia applicazione si chiama
MicroArray e usa un database nomedb....Grazie mille
codice:
      <Context docBase="SpectraWEB" path="/SpectraWEB"
reloadable="true"
source="org.eclipse.jst.j2ee.server:SpectraWEB"/><Context
docBase="MicroArray" path="/MicroArray" reloadable="true"
source="org.eclipse.jst.j2ee.server:MicroArray"/>
      <Resource name="jdbc/nomedb" auth="Container"
            type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/nomedb">
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>shevagol</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:apache:commons:dbcp:nomedb</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>8</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>4</value>
    </parameter>
  </ResourceParams>
      <Context docBase="Bookstore" path="/Bookstore" reloadable="true"
source="org.eclipse.jst.j2ee.server:Bookstore"/><Context
docBase="Jsf-example2-1.0" path="/Jsf-example2-1.0" reloadable="true"
source="org.eclipse.jst.j2ee.server:Jsf-example2-1.0"/></Host>
    </Engine>
  </Service>
</Server>
Il web.xml della mia applicazione è
codice:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN"
                         "
http://java.sun.com/dtd/web-app_2_3.dtd
">
<web-app>
 <context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>client</param-value>
 </context-param>
 <filter>
  <filter-name>ExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
  <init-param>
   <param-name>uploadMaxFileSize</param-name>
   <param-value>100m</param-value>
  </init-param>
  <init-param>
   <param-name>uploadThresholdSize</param-name>
   <param-value>100k</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>ExtensionsFilter</filter-name>
  <servlet-name>FacesServlet</servlet-name>
 </filter-mapping>
 <servlet>
  <servlet-name>FacesServlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>FacesServlet</servlet-name>
  <url-pattern>/faces/*</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>FacesServlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <resource-ref>
  <description>Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the server.xml file.</description>
  <res-ref-name>jdbc/nomedb</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
</web-app>
Il bean di interesse è MyBean e il metodo chiamato è carica(), le cui
operazioni riguardanti il db sono
codice:Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource)envCtx.lookup("jdbc/nomedb");
            Connection conn = ds.getConnection();
            PreparedStatement pst = conn.prepareStatement("INSERT INTO
tbl(Data) VALUES (?)");
// imposto i valori
         				// pst.setInt(1,1);
            pst.setBytes(1, data);
         	pst.executeUpdate();
         	pst.close();
         	conn.close();
Grazie ancora...aiutando me aiuterete tantissime altre persone nella
mia stessa situazione(così dicono i forum........)

...
<mega_cut>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>url</name>
!!!! La url per Mysql ha questa forma: jdbc:mysql://server:port/nomedb
      <value>jdbc:apache:commons:dbcp:nomedb</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>8</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>4</value>
    </parameter>
  </ResourceParams>
Inoltre devi aver messo le librerie (i driver JDBC) di mysql tra quelle di
tomcat (c'č il posto giusto che se non ricordo male č
TOMCAT_HOME/common/lib)....
fai sapere

Grazie Andrea....
ma niente.
Ho fatto le tue modifiche(me ne ero accorto stanotte dell'errore),ho
controllato che le librerie fossero presenti ma niente....
potete continuare ad aiutarmi?

 ha scritto nel messaggio
news:1152602888.5...@h48g2000cwc.googlegroups.com...


sto davvero impazzendo con questo problema!!!
Ma è il più famoso sul web!!!!Ognuno poi si inventa una soluzione e a
me non funziona niente....
cmq,ti illustro miei progressi..
dopo un'immane fatica ,ecco il mio codice che dovrebbe fare l'upload di
un array di byte in un campo blob.
try {
Context ctx = new InitialContext();
if (ctx == null){
throw new Exception("Boom - No Context");
}
Context envCtx = (Context) ctx.lookup("java:comp/env");
k=9;
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/nomedb");
 //"java:comp/env/jdbc/nomedb"
k=10;
if (ds != null) {
k=11;
Connection conn = ds.getConnection();
k=12;
if (conn != null) {
PreparedStatement pst = null;
pst = conn.prepareStatement("INSERT INTO tbl(Data) VALUES (?)");
// pst.setInt(1,1);
pst.setBytes(1, data);
pst.executeUpdate();
pst.close();
conn.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
Purtroppo il codice funziona fino a k=11, interrompendosi magicamente
su
Connection conn = ds.getConnection();
Le eccezioni generate sono
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver
of class '' for connect URL 'null'
	at
org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
	at
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:554)
	at giu.MyBean.carica(MyBean.java:198)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at
com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:126)
	at
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)

Caused by: java.sql.SQLException: No suitable driver
	at java.sql.DriverManager.getDriver(Unknown Source)
	at
org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
	... 42 more
Ti posto il server.xml di Tomcat(la parte da me modificata)
 <Logger className="org.apache.catalina.logger.FileLogger"
directory="logs" prefix="localhost_log." suffix=".txt"
timestamp="true"/>
      <Context docBase="SpectraWEB" path="/SpectraWEB"
reloadable="true" source="org.eclipse.jst.j2ee.server:SpectraWEB"/>
      <Context docBase="Bookstore" path="/Bookstore" reloadable="true"
source="org.eclipse.jst.j2ee.server:Bookstore"/><Context
docBase="Jsf-example2-1.0" path="/Jsf-example2-1.0" reloadable="true"
source="org.eclipse.jst.j2ee.server:Jsf-example2-1.0"/><Context
docBase="MicroArray2" path="/MicroArray" reloadable="true"
source="org.eclipse.jst.j2ee.server:MicroArray2"/>
      <Resource name="MysqlJNDI" type="javax.sql.DataSource"/>
<ResourceParams name="MysqlJNDI">
<parameter>
  <name>maxWait</name>
  <value>5000</value>
</parameter>
<parameter>
  <name>maxActive</name>
  <value>4</value>
</parameter>
<parameter>
  <name>username</name>
  <value>root</value>
</parameter>
<parameter>
  <name>password</name>
  <value>shevagol</value>
</parameter>
<parameter>
  <name>url</name>
  <value>jdbc:mysql://localhost:3306/nomeDB</value>
</parameter>
<parameter>
  <name>driverClassName</name>
  <value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
  <name>maxIdle</name>
  <value>2</value>
</parameter>
</ResourceParams>
      </Host>
    </Engine>
  </Service>
</Server>
e il web.xml della mia applicazione


  <description>DB Connection</description>
  <res-ref-name>jdbc/nomedb</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
</web-app>
Il mio database si chiama nomedb e l'applicazione
MicroArray2.........ti prego puoi andarmi un aiuto.............non ce
la faccio+...................

come speri che possa trovare nel contesto "jdbc/nomedb" se piu avanti....nel
server.xml
hai dato il nome "MysqlJNDI"
NB:
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/nomedb");
ALLORA DOVRAI USARE: DataSource ds = (DataSource)
ctx.lookup("java:comp/env/MysqlJNDI");
 //"java:comp/env/jdbc/nomedb"
k=10;
SERVER.XML *****************
      <Resource name="MysqlJNDI" type="javax.sql.DataSource"/>
<ResourceParams name="MysqlJNDI">
.....
<parameter>
  <name>url</name>
  <value>jdbc:mysql://localhost:3306/nomeDB</value> QUESTO E' L'UNICO POSTO
IN CUI DEVI SCRIVERE L'EFFETTIVO NOME DEL DB (il resto dei nomi (Resource,
Ref ecc....) sono nomi che ti inventi tu!)
</parameter>
<parameter>
  <name>driverClassName</name>
  <value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
  <name>maxIdle</name>
  <value>2</value>
</parameter>
</ResourceParams>
WEB.XML **************************
  <res-ref-name>jdbc/nomedb</res-ref-name> NON LO TROVERA' MAI !! DEVI
RENDERE COERENTI I NOMI
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
</web-app>
CMQ QUESTA PARTE DEL <resource-ref> TOGLILA DA web.xml, l'hai gia messa in
server xml
ciao

<Context
docBase="MicroArray2" path="/MicroArray" reloadable="true"
source="org.eclipse.jst.j2ee.server:MicroArray2"/>
CAVOLO: non avevo visto la barra / che chiude il context, resource e
resource-params devono stare DENTRO al context
<Context docBase="MicroArray2" path="/MicroArray" reloadable="true">
    <Resource name="MysqlJNDI" type="javax.sql.DataSource"/>

</ResourceParams>
</context>
ciao

Grazie mille e scusa la mia inesperienza,
grazie a te ho risolto il problema e tutto funziona alla
perfezione...grazie grazie grazie