Spring Bootですべてのデータベース関連の自動構成を無効にする


115

私はSpring Bootを使用して2つのアプリケーションを開発しています。1つはサーバーとして機能し、もう1つはクライアントアプリです。ただし、どちらも同じアプリであり、アクティブなプロファイルによって機能が異なります。Spring Bootの自動構成機能を使用してアプリケーションを構成しています。

データベース接続を必要としないので、クライアントアプリですべてのデータベース関連の自動構成を無効にします。アプリケーションは、データベースとの接続を確立しようとしたり、Spring Data機能やHibernate機能を使用したりしないでください。データベースの自動構成の有効化または無効化は、条件付きであり、アプリのアクティブなプロファイルに基づいている必要があります。

それぞれのプロファイルに対して2つの異なるapplication.propertiesファイルを作成することでこれを実現できますか?

これを私のプロパティファイルに追加してみました、

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
  org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

ただし、アプリケーションは起動時にデータベースへの接続を試みます。それらの除外は私の要件を達成するのに十分ですか?


これは役立つかもしれません。
Rahul Sharma

コード/構成を開示できますか?
luboskrnac

2
ビルドツールプロファイルを使用して、データに関連する依存関係をプロファイルの1つにのみ追加することもできます。他のプロファイルを使用してアプリをパッケージ化する場合、クラスパスに必要なスターターパッケージが存在しないため、自動構成されません
Ali Dehghani

回答:


99

私が同様のことをする方法は次のとおりです:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
    //it can be left blank
}

サーバーアプリ用に同様のものを記述します(除外なし)。

最後のステップは、メインスプリングブートクラスから自動構成を無効にすることです。

@SpringBootApplication
public class SomeApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SomeApplication.class);
    }

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SomeApplication.class);
    }
}

変更:@SpringBootApplicationに:

@Configuration 
@ComponentScan

これでうまくいくはずです。ここで、例で除外した依存関係は不完全になる可能性があります。それらは私には十分でしたが、データベース関連のライブラリを完全に無効にするのに十分かどうかはわかりません。以下のリストを確認してください。

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes

それが役に立てば幸い


5
@SpringBootApplication持っているexclude財産を、の必要はありませんClientAppConfiguration
Abhijit Sarkar

ClientAppConfigurationを使用せずに、アクティブなプロファイルに基づいて条件付きで除外することはできますか?
patrykos91

1
はい。あなたには排除したい@SpringBootApplication、その後、特定のパッケージには、作成@Configurationしたクラス@Import、関連クラスのをとに依存している@Profileかを@Conditional。そうすることで、autoconfigがアプリ全体にリークすることなく、各アプリケーションレイヤーをテストできます。DBをテストしますか?DBパッケージをスキャンし、モックDBを構成するだけでよいのです。
Abhijit Sarkar

87

すべてのデータベース関連の自動構成を無効にして終了するには:

データベースタイプNONEの組み込みデータベースドライバクラスを判別できません

1.アノテーションを使用する:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(PayPalApplication.class, args);
    }
}

2. Application.propertiesを使用:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Spring Boot 2+でApplication.propertiesを使用することは、アノテーションよりも望ましい方法です。
グスタボロドリゲス

@GustavoRodriguesは、ステートメントをサポートするためのドキュメントを共有できますか?ありがとう!
Betlista

27

クラスを区切るためのカンマを忘れたようです。したがって、設定に基づいて、次のように機能します。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

または、次のように定義することもできます。

spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude[2]=org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
spring.autoconfigure.exclude[3]=org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

17

@SpringBootApplicationアノテーションを使用して特定の自動設定クラスを除外する方法があります。

@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class, 
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {         
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

@SpringBootApplication#excludeattributeはattributeのエイリアスであり、@EnableAutoConfiguration#excludeかなり便利で便利です。カスタムデータベース構成を適用する方法を示すために、サンプル
に追加@Import(MyPersistenceConfiguration.class)しました。


2
ありがとう!これが最も現代的な答えです。ここにリンクされている:konstructcomputers.blogspot.com/2018/10/...
ジョシュア・デイビス

9

私のための方法は追加することでした

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

Springブートを実行しているクラスへの注釈( `@SpringBootApplicationでマークされています)。

最後に、次のようになります。

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }

7

プロファイルを介してそれを制御する別の方法はこれです:

// note: no @SpringApplication annotation here
@Import(DatabaseConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
@Import({DatabaseConfig.WithDB.class, DatabaseConfig.WithoutDB.class})
public class DatabaseConfig {

    @Profile("!db")
    @EnableAutoConfiguration(
            exclude = {DataSourceAutoConfiguration.class,   DataSourceTransactionManagerAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class})
    static class WithoutDB {

    }

    @Profile("db")
    @EnableAutoConfiguration
    static class WithDB {

    }
}

アプリケーションを起動したときにメッセージが出力されるように、WithoutDBおよびWithDBクラス内にロガーを配置する方法を教えてください。ありがとう
ankur pramanik

2

私はここで同じ問題を抱えており、次のように解決しました:

application-{yourprofile}.yml「yourprofile」を「client」にできる別の場所を追加してください。

私の場合、DevプロファイルでRedisを削除したかったのでapplication-dev.yml、メインの横にを追加しましたapplication.yml

このファイルに私は入れました:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

これはプロパティファイルでも機能します。

そのためにアプリケーションコードを変更する必要がないという事実が気に入っています。


0

上記のソリューションをすべて実行しても、このエラーが発生しました。

 by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...

ある時点でPOMを調べると、この依存関係がありました

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

そして、Pojoクラスには以下のインポートがありました

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;

これは、アプリケーションがデータソースを期待していたことを明確に示しています。

私がしたことは、pomからJPA依存関係を削除し、pojoのインポートを次のように一度置き換えたことです

import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;

最後に、私は成功したビルドを手に入れました。同じ問題が発生した可能性があることを確認してください


これは、説明されている問題の解決策ではありません。問題は、アプリケーションからJPAサポートをすべて削除することではなく、コード(Mavenプロジェクト構成)を変更せずに、条件(Springプロファイルなど)に基づいて有効/無効にすることです。DS / JPA関連のクラスをロードするのではなく、「no-datasource」構成をロードするSpringプロファイルを定義してアクティブ化するのを忘れたため、データソース関連のエラーが発生していました。JPAライブラリは引き続きディストリビューションに残っているはずです。
cvnew

1
私の投稿を完全に読んだとは思いません。最後の行で私はそれが同様の問題である可能性があることを示唆していますが、それが答えであるとは言いません
Tadele Ayelegn

0

@SpringBootApplicationの後にmyApp.javaを追加します

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class、DataSourceTransactionManagerAutoConfiguration.class、HibernateJpaAutoConfiguration.class})

そして変更

@SpringBootApplication => @Configuration

だから、私はこれを私のメインクラス(myApp.java)に持っています

package br.com.company.project.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class SomeApplication {

public static void main(String[] args) {
    SpringApplication.run(SomeApplication.class, args);
}

}

そして私のために働きなさい!=)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.