Resolvendo o erro "Falha ao configurar uma fonte de dados"

Resolvendo o erro "Falha ao configurar uma fonte de dados"

1. Visão geral

Neste breve tutorial, discutiremoswhat causes and what resolves the “Failed to configure a DataSource” error on a Spring Boot project.

Resolveremos o problema usando duas abordagens diferentes:

  1. Definindo a fonte de dados

  2. Desativando a configuração automática da fonte de dados

2. O problema

Agora, suponha que temos um projeto Spring Boot e adicionamosspring-data-starter-jpadependencye aMySQL JDBC driver ao nossopom.xml:


    org.springframework.boot
    spring-boot-starter-data-jpa


    mysql
    mysql-connector-java
    runtime

Mas, quando executamos o aplicativo, ele falha com o erro:

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

Vamos ver por que isso está acontecendo.

3. A causa

Por design, a configuração automática do Spring Boot tenta configurar os beans automaticamente com base nas dependências adicionadas ao classpath.

E, como temos a dependência JPA em nosso classpath, o Spring Boot tenta configurar automaticamente um JPADataSource. O problema éwe haven’t given Spring the information it needs to perform the auto-configuration.

Por exemplo, não definimos nenhuma propriedade de conexão JDBC e precisaremos fazer isso ao trabalhar com bancos de dados externos como MySQL e MSSQL. Por outro lado, não enfrentaremos esse problema com bancos de dados in-memory como H2, pois eles podem criar uma fonte de dados sem todas essas informações.

4. Soluções

4.1. Defina oDataSource usando propriedades

Como o problema ocorre devido à falta de conexão do banco de dados, podemos resolver o problema simplesmente fornecendo as propriedades da fonte de dados.

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

Ou podemosprovide the data source properties in application.yml:

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myDb
    username: user1
    password: pass

4.2. Defina oDataSource programaticamente

Alternativamente, podemosdefine our data source programmatically, porusing the utility builder class DataSourceBuilder. Precisamos fornecer a URL do banco de dados, nome de usuário, senha e as informações do driver SQL para criar nossa fonte de dados:

@Configuration
public class DatasourceConfig {
    @Bean
    public DataSource datasource() {
        return DataSourceBuilder.create()
          .driverClassName("com.mysql.cj.jdbc.Driver")
          .url("jdbc:mysql://localhost:3306/myDb")
          .username("user1")
          .password("pass")
          .build();
    }
}

Em resumo, podemos optar por usar qualquer uma das opções acima para configurar uma fonte de dados conforme nossos requisitos.

4.3. ExcluirDataSourceAutoConfiguration

Na seção anterior, corrigimos o problema adicionando as propriedades da fonte de dados ao nosso projeto. Mas, como podemos resolver isso se ainda não estamos prontos para definir nossa fonte de dados?

Vamos ver comoprevent Spring Boot from auto-configuring the data source.

A classeDataSourceAutoConfiguration é a classe base para configurar uma fonte de dados usando as propriedadesspring.datasource.*.

Agora, existem algumas maneiras de podermosexclude this from the auto-configuration.

Primeiro, podemosdisable the auto-configuration using the spring.autoconfigure.excludeproperty em nosso arquivoapplication.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Da mesma forma, podemos fazer o mesmo usando nosso arquivoapplication.yml:

spring:
  autoconfigure:
    exclude:
    - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Ou podemosuse the exclude attribute on our @SpringBootApplication or @EnableAutoConfiguration annotation:

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

Em todos os exemplos acima, nósdisabled the auto-configuration of the DataSource. E isso não afetará a configuração automática de outros beans.

Portanto, para resumir, podemos usar qualquer um dos métodos acima para desativar a configuração automática do Spring Boot da fonte de dados.

Idealmente, devemos fornecer as informações da fonte de dados e usar a opção de exclusão apenas para teste.

5. Conclusão

Neste artigo, vimos o que causa o erro“Failed to configure a DataSource”. Primeiro, corrigimos o problema definindo a fonte de dados. Em seguida, discutimos como solucionar o problema sem configurar a fonte de dados.

Como sempre, o código completo usado neste artigo está disponível emGitHub.