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:
-
Definindo a fonte de dados
-
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.
Primeiro, vamosdefine the data source properties in the application.properties file do nosso projeto:
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.