Cómo resolver el error Failed to configure a DataSource en Spring Boot

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:

  1. Deshabilitándolo utilizando la propiedad spring.autoconfigure.exclude en nuestro archivo application.properties:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  1. O usando nuestro archivo application.yml:
spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  1. 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!