2008-10-02 19 views
18

Estoy tratando de probar la unidad (JUnit) un DAO que he creado. Estoy usando Spring como mi framework, mi DAO (JdbcPackageDAO) extiende SimpleJdbcDaoSupport. La clase de prueba (JdbcPackageDAOTest) extiende AbstractTransactionalDataSourceSpringContextTests. He anulado los configLocations de la siguiente manera:Causa de No se encontró el controlador adecuado para

protected String[] getConfigLocations(){ 
    return new String[] {"classpath:company/dc/test-context.xml"}; 
} 

Mi archivo de prueba-context.xml se define como sigue:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="dataPackageDao" class="company.data.dao.JdbcPackageDAO"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
     <property name="url" value="jdbc:hsqldb:hsql://localhost"/> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>company/data/dao/jdbc.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
</beans> 

estoy usando HSQL como mi back-end, que se está ejecutando en modo autónomo. Mi IDE de elección es eclipse. Cuando ejecuto la clase como una prueba JUnit aquí está mi error (a continuación). No tengo idea de por qué está sucediendo. hsql.jar está en mi ruta de compilación según Eclipse.

 
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost 
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) 
    at org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) 
    at org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) 
    at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) 
    at junit.framework.TestCase.runBare(TestCase.java:128) 
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) 
    at junit.framework.TestResult$1.protect(TestResult.java:106) 
    at junit.framework.TestResult.runProtected(TestResult.java:124) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:120) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
Caused by: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) 
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) 
    ... 18 more 

Respuesta

2

Parece que usted no está especificando un nombre de base de datos para conectarse a, debería ser algo como

jdbc:hsqldb:hsql://serverName:port/DBname 
1

se puede importar el conductor (org.hsqldb.jdbcDriver) en uno de su fuente archivos? (Para probar que la clase está realmente en su camino de clase).

Si no puede importarlo, puede intentar incluir hsqldb.jar en su ruta de compilación.

+0

Puedo importar jdbcDriver; lo que significa que hsqldb está en mi ruta de compilación. – IaCoder

0

Podría ser que

hsql://localhost

no se puede resolver en un archivo. Mira el programa de ejemplo aquí:

Sample HSQLDB program

ver si se puede conseguir que el trabajo en primer lugar, y luego ver si se puede tomar esa información de configuración y usarla en la configuración de frijol de primavera.

¡Buena suerte!

0

Creo que su URL de HSQL es incorrecta. También debe incluir el nombre de la base de datos,

así que algo como

jdbc:hsqldb:hsql://localhost/mydatabase 

si mydatabase es el nombre de su base de datos (archivo). No incluir esto puede (no estoy seguro si es el caso aquí) confundir el análisis sintáctico de la URL, lo que puede llevar al DriverManagerDS a pensar que su controlador no es adecuado (se encuentra, pero cree que no es bueno uno)

3

Bueno, así que aquí está la solución. La mayoría de todos hicieron puntos realmente buenos, pero ninguno resolvió el problema (GRACIAS por la ayuda). Aquí está la solución que encontré para trabajar.

  1. frascos pasar de la .../WEB-INF/lib a PROJECT_ROOT/lib
  2. Alter Vía de construcción en Eclipse para reflejar este cambio.
  3. limpié y reconstruí mi proyecto.
  4. ejecutó la prueba junit y BOOM funcionó!

Supongo que tiene algo que ver con cómo Ganymede lee frascos en la carpeta/web-inf/lib. Pero quién sabe ... Funciona ahora.

0

No estoy seguro de si vale la pena algo, pero tuve un problema similar cuando recibí un error "java.sql.SQLException: No se encontró controlador adecuado". Encontré este hilo mientras investigaba una solución.

La manera en que terminé solucionando mi problema fue renunciar al uso de java.sql.DriverManager para obtener una conexión y en su lugar construí una instancia de org.hsqldb.jdbc.jdbcDataSource y la utilicé.

La causa principal de mi problema (creo) tenía que ver con la jerarquía del cargador de clases y el hecho de que el JRE estaba ejecutando Java 5. Aunque pude cargar satisfactoriamente la clase jdbcDriver, el cargador de clases detrás de java.sql.DriverManager estaba más arriba, al punto que no podía ver el hsqldb.jar que necesitaba.

De todos modos, solo ponga esta nota aquí en caso de que alguien más tropiece con un problema similar.

10

"controlador no adecuado" generalmente significa que la sintaxis de la URL de conexión es incorrecta.

3

Si nos fijamos en la cadena de conexión original:

<property name="url" value="jdbc:hsqldb:hsql://localhost"/> 

Los documentos Hypersonic sugieren que se está perdiendo un alias después de localhost:

http://hsqldb.org/doc/guide/ch04.html

+0

Eso lo solucionó para mí. La propiedad de conexión tenía problemas. – leeand00

1

tuve el mismo problema con la primavera , commons-dbcp y oracle 10g. Utilizando este URL me dieron el 'no es adecuado conductor de error: jdbc: oracle: [email protected]: 1521: Kinangop

La URL anterior no se encuentra dos puntos completa justo antes de la @. Después de corregir eso, el error desapareció.

+0

También descubrí que org.springframework.jdbc.datasource.DriverManagerDataSource proporciona un error más informativo para la misma condición. –

27

Para que HSQLDB se registre a sí mismo, necesita acceder a su clase jdbcDriver. Puede hacer esto de la misma manera que en este example.

Class.forName("org.hsqldb.jdbcDriver"); 

Se dispara la inicialización estática de la clase jdbcDriver, que es:

static { 
    try { 
     DriverManager.registerDriver(new jdbcDriver()); 
    } catch (Exception e) {} 
} 
+0

Él ya solucionó el problema. – BalusC

+7

Vi eso, pero tuve el problema similar y la solución fue como se muestra arriba. Así que pensé por qué no compartirlo con mis compañeros desbordamientos;) –

+1

+1 Esta respuesta fue mi solución donde OP no era – Adam

2

gran Yo tenía el mismo problema. El consejo para todos es comprobar jdbc url sintax

1

cuando intentemos ejecutar la conectividad del origen de datos utilizando el método principal estático, primero debemos ejecutar la conexión a la base de datos. Esto lo podemos lograr en eclipse como abajo.

1) abra cualquier IDE (Eclipse o RAD) después de abrir el espacio de trabajo de forma predeterminada IDE se abrirá en JAVA prospectivo. Intente cambiar de java a prospecto de base de datos para crear un origen de datos así como conectividad de base de datos virtual.

2) en la base de datos posible ingrese todos los detalles como nombre de usuario, contraseña y URL del esquema particular.

3) luego intente ejecutar el método principal para acceder a la base de datos.

Esto resolverá el "serverName undefined".

1

Como algunos respondieron delante, esta línea de código resuelto el problema

Class.forName("org.hsqldb.jdbcDriver"); 

Pero mi aplicación se está ejecutando en algunos gatos machos, pero sólo en una instalación que tenía que añadir este código.

0

Estaba enfrentando un problema similar y para mi sorpresa el problema estaba en la versión de Java. java.sql.DriverManager viene de rt.jar no pudo cargar mi controlador "COM.ibm.db2.jdbc.app.DB2Driver".

Actualicé de jdk 5 y jdk 6 y funcionó.

+1

¿Qué tiene que ver DB2 con HSQLDB? – Raystorm

0

En algunos casos, compruebe los permisos (propiedad).

Cuestiones relacionadas