「DataSourceの構成に失敗しました」エラーの解決

1. 概要

この短いチュートリアルでは、Spring Bootプロジェクトでの「データソースの構成に失敗しました」エラーの原因と解決方法について説明します。*
2つの異なるアプローチを使用して問題を解決します。
  1. データソースの定義

  2. データソースの自動構成を無効にする

2. 問題

ここで、Spring Bootプロジェクトがあり、_https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-data-jpa%22を追加したとします%20g%3A%22org.springframework.boot%22 [spring-data-starter-jpa] _ https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter -data-jpa%22%20g%3A%22org.springframework.boot%22 [dependency]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22mysql-connector- java%22%20g%3A%22mysql%22 [MySQL JDBC driver] to _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. プロパティを使用して_DataSource_を定義する

*データベース接続の欠落が原因で問題が発生するため、データソースプロパティを提供するだけで問題を解決できます。*
まず、https://www.baeldung.com/spring-testing-separate-data-source [*プロジェクトの_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. _DataSource_をプログラムで定義する

または、ユーティリティビルダークラス_DataSourceBuilder_ *を使用して、https://www.baeldung.com/spring-boot-configure-data-source-programmatic [プログラムでデータソースを定義]することもできます。 データソースを作成するには、データベース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。* _プロパティを使用してデータソースを構成するための基本クラスです。
    これで、https://www.baeldung.com/spring-boot-exclude-auto-configuration-test [自動構成からこれを除外]できるいくつかの方法があります。
    まず、_application.properties_ファイルの_spring.autoconfigure.exclude_ * * property *を使用して、自動構成を無効にすることができます。
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
同様に、application.ymlファイルを使用しても同じことができます。
spring:
  autoconfigure:
    exclude:
    - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
または、* @ SpringBootApplication_または_ @ EnableAutoConfiguration_アノテーションで_exclude_属性を使用できます*:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
上記のすべての例で、_DataSource_ *の自動構成を*無効にしました。 また、これは他のBeanの自動構成には影響しません。
要約すると、上記の方法のいずれかを使用して、Spring Bootのデータソースの自動構成を無効にすることができます。
理想的には、データソース情報を提供し、テストのみにexcludeオプションを使用する必要があります。

5. 結論

この記事では、「データソースの構成に失敗しました」_エラーの原因について説明しました。 まず、データソースを定義することで問題を修正しました。 次に、データソースをまったく構成せずに問題を回避する方法について説明しました。
いつものように、この記事で使用される完全なコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-boot-persistence[GitHub]で入手できます。