Introducción
En esta entrada de blog, vamos a discutir qué causa y cómo resolver el error “Failed to configure a DataSource” en un proyecto de Spring Boot. Este es un error común entre los desarrolladores que trabajan con Spring Boot y bases de datos JDBC, como MySQL. A lo largo del artículo, exploraremos dos enfoques para resolver este problema:
- Definiendo la fuente de datos.
- Deshabilitando la auto-configuración de la fuente de datos.
La comprensión de cómo funciona la configuración de la fuente de datos en Spring Boot te permitirá gestionar mejor tus aplicaciones y evitar estos errores en el futuro.
El Problema
Supongamos que tenemos un proyecto de Spring Boot y hemos agregado la dependencia spring-data-starter-jpa
y un controlador JDBC de MySQL a nuestro archivo pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
Sin embargo, cuando ejecutamos la aplicación, falla con el siguiente error:
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Analicemos por qué esto está ocurriendo.
La Causa
Por diseño, la auto-configuración de Spring Boot intenta configurar los beans automáticamente, basándose en las dependencias que se han agregado al classpath.
Dado que tenemos la dependencia de JPA en nuestro classpath, Spring Boot intenta configurar automáticamente un DataSource
JPA. El problema es que no hemos proporcionado la información que Spring necesita para realizar la auto-configuración.
Por ejemplo, no hemos definido ninguna propiedad de conexión JDBC, y necesitaremos hacerlo cuando trabajemos con bases de datos externas como MySQL y MSSQL. Por otro lado, no enfrentaremos este problema con bases de datos en memoria como H2, ya que pueden crear una fuente de datos sin toda esta información.
Soluciones
1. Definir la DataSource
Usando Propiedades
Dado que el problema se produce debido a la falta de conexión a la base de datos, podemos resolverlo simplemente proporcionando las propiedades de la fuente de datos.
Primero, definimos las propiedades de la fuente de datos en el archivo application.properties
de nuestro proyecto:
spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.username=user1
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
O podemos proporcionar las propiedades de la fuente de datos en el archivo application.yml
:
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myDb
username: user1
password: pass
2. Definir la DataSource
Programáticamente
Alternativamente, podemos definir nuestra fuente de datos programáticamente utilizando la clase utilitaria DataSourceBuilder
. Necesitamos proporcionar la URL de la base de datos, el nombre de usuario, la contraseña y la información del controlador SQL para crear nuestra fuente de datos:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource getDataSource() {
return DataSourceBuilder.create()
.driverClassName("com.mysql.cj.jdbc.Driver")
.url("jdbc:mysql://localhost:3306/myDb")
.username("user1")
.password("pass")
.build();
}
}
En resumen, podemos optar por utilizar cualquiera de las opciones anteriores para configurar una fuente de datos según nuestros requisitos.
3. Excluir DataSourceAutoConfiguration
En la sección anterior, solucionamos el problema al agregar las propiedades de la fuente de datos a nuestro proyecto.
Pero, ¿cómo resolvemos esto si aún no estamos listos para definir nuestra fuente de datos? Veamos cómo prevenir que Spring Boot auto-configure la fuente de datos.
La clase DataSourceAutoConfiguration
es la clase base para configurar una fuente de datos utilizando las propiedades spring.datasource.*
.
Podemos excluir esta auto-configuración de varias formas:
- Deshabilitándolo utilizando la propiedad
spring.autoconfigure.exclude
en nuestro archivoapplication.properties
:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- O usando nuestro archivo
application.yml
:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- O podemos utilizar el atributo
exclude
en nuestra anotación@SpringBootApplication
o@EnableAutoConfiguration
:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
En todos los ejemplos anteriores, deshabilitamos la auto-configuración de la DataSource
, y esto no afectará la auto-configuración de ningún otro bean.
Idealmente, deberíamos proporcionar la información de la fuente de datos y utilizar la opción de exclusión solo para las pruebas.
Conclusiones Prácticas
En este artículo, hemos visto qué causa el error “Failed to configure a DataSource”. Primero, solucionamos el problema definiendo la fuente de datos. Luego, discutimos cómo trabajar alrededor del problema sin configurar la fuente de datos en absoluto.
Consejos Prácticos:
- Siempre verifica que has configurado correctamente las propiedades de conexión antes de ejecutar tu aplicación. Esto incluye la URL, el nombre de usuario y la contraseña.
- Utiliza el enfoque programático para una mayor flexibilidad, especialmente cuando necesitas crear la configuración de la fuente de datos en función de condiciones dinámicas o entornos de ejecución.
- Consulta la documentación de Spring Boot y el introducción a la configuración de un
DataSource
programáticamente para profundizar en más ejemplos y prácticas recomendadas.
Con esta comprensión profunda de la configuración de la fuente de datos en Spring Boot, podrás evitar errores comunes y gestionar tus proyectos más eficientemente. ¡Feliz codificación!