1. Обзор
В этом кратком руководстве мы обсудим причины и способы устранения ошибки «Не удалось настроить источник данных»
в проекте Spring Boot.
Мы решим проблему, используя два разных подхода:
- Определение источника данных
- Отключение автоконфигурации источника данных
2. Проблема
Предположим, у нас есть проект Spring Boot, и мы добавили зависимость spring-data-starter-jpa
и драйвер MySQL JDBC в наш 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>
Но когда мы запускаем приложение, оно выходит из строя с этой ошибкой:
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
Давайте посмотрим, почему это происходит.
3. Причина
По замыслу автоконфигурация Spring Boot пытается настроить bean-компоненты автоматически на основе зависимостей, добавленных в путь к классам.
И поскольку у нас есть зависимость JPA от нашего пути к классам, Spring Boot пытается автоматически настроить JPA DataSource
. Проблема в том, что мы не предоставили Spring информацию, необходимую для выполнения автоматической настройки.
Например, мы не определили какие-либо свойства подключения JDBC, и нам потребуется это сделать при работе с внешними базами данных, такими как MySQL и MSSQL. С другой стороны, мы не столкнемся с этой проблемой с базами данных в памяти, такими как H2, поскольку они могут создать источник данных без всей этой информации.
4. Решения
4.1. Определите источник
данных с помощью свойств
Поскольку проблема возникает из-за отсутствия подключения к базе данных, мы можем решить проблему, просто предоставив свойства источника данных.
Во-первых, давайте определим свойства источника данных в файле application.properties
нашего проекта:
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
Или мы можем предоставить свойства источника данных в application.yml
:
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myDb
username: user1
password: pass
4.2. Определите источник данных
программно
Кроме того, мы можем определить наш источник данных программно , используя класс утилиты DataSourceBuilder
.
Нам нужно предоставить URL-адрес базы данных, имя пользователя, пароль и информацию о драйвере SQL для создания нашего источника данных:
@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();
}
}
Короче говоря, мы можем использовать любой из вышеперечисленных вариантов для настройки источника данных в соответствии с нашими требованиями.
4.3. Исключить DataSourceAutoConfiguration
В предыдущем разделе мы исправили проблему, добавив свойства источника данных в наш проект.
Но как решить эту проблему, если мы еще не готовы определить наш источник данных? Давайте посмотрим, как запретить Spring Boot автоматически настраивать источник данных.
Класс DataSourceAutoConfiguration
является базовым классом для настройки источника данных с использованием свойств spring.datasource.*
.
Теперь есть несколько способов исключить это из автонастройки .
Во- первых, мы можем отключить автоматическую настройку, используя `` свойство spring.autoconfigure.exclude
в нашем файле application.properties :
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
И мы можем сделать то же самое, используя наш файл application.yml :
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
Или мы можем использовать атрибут exclude
в нашей аннотации @SpringBootApplication
или @EnableAutoConfiguration
:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
Во всех приведенных выше примерах мы отключили автоконфигурацию DataSource
. И это не повлияет на автоматическую настройку любых других bean-компонентов.
Итак, подводя итог, мы можем использовать любой из вышеперечисленных методов, чтобы отключить автоматическую настройку Spring Boot источника данных.
В идеале мы должны предоставить информацию об источнике данных и использовать опцию исключения только для тестирования.
5. Вывод
В этой статье мы увидели, что вызывает ошибку «Не удалось настроить источник
данных» .
Во-первых, мы исправили проблему, определив источник данных.
Далее мы обсудили, как обойти эту проблему, вообще не настраивая источник данных.
Как всегда, полный код, использованный в этой статье, доступен на GitHub .