1. 概要

この短いチュートリアルでは、SpringBootプロジェクトで「データソースの構成に失敗しました」エラーの原因と解決策について説明します。

2つの異なるアプローチを使用して問題を解決します。

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

2. 問題

Spring Bootプロジェクトがあり、 spring -data-starter-jpa依存関係MySQLJDBCドライバーを追加したとします。 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依存関係があるため、SpringBootはJPADataSourceを自動的に構成しようとします。 問題は、自動構成を実行するために必要な情報をSpringに提供していないことです。

たとえば、JDBC接続プロパティを定義していないため、MySQLやMSSQLなどの外部データベースを使用する場合は定義する必要があります。 一方、H2などのインメモリデータベースでは、これらすべての情報がなくてもデータソースを作成できるため、この問題に直面することはありません。

4. ソリューション

4.1. プロパティを使用してDataSourceを定義する

この問題はデータベース接続がないために発生するため、データソースのプロパティを提供するだけで問題を解決できます。

まず、プロジェクトの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を使用してプログラムでデータソースを定義することもできます。

データソースを作成するには、データベースの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。*プロパティを使用してデータソースを構成するための基本クラスです。

ここで、これを自動構成から除外する方法がいくつかあります。

まず、application.propertiesファイルのspring.autoconfigure.excludepropertyを使用して自動構成を無効にすることができます。

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})

上記のすべての例で、データソースの自動構成を無効にしました。これは他のBeanの自動構成には影響しません。

したがって、要約すると、上記の方法のいずれかを使用して、Spring Bootのデータソースの自動構成を無効にすることができます。

理想的には、データソース情報を提供し、テストにのみ除外オプションを使用する必要があります。

5. 結論

この記事では、「データソースの構成に失敗しました」エラーの原因を確認しました。

まず、データソースを定義することで問題を修正しました。

次に、データソースをまったく構成せずに問題を回避する方法について説明しました。

いつものように、この記事で使用されている完全なコードはGitHubで入手できます。