web-dev-qa-db-ja.com

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

私は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

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

85
yuva

私は同じようなことをするだろう方法は:

@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

それが役立つことを願っています

61
patrykos91

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

データベースタイプ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
70
Jorge López

あなたがクラスを区切るためにカンマを忘れてしまったようです。そのため、あなたの設定に基づいて、以下がうまくいくでしょう:

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
23
Julien May

私にとっての解決策は追加することでした

@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);
    }
 }
9
ryzhman

@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#exclude属性は@EnableAutoConfiguration#exclude属性の別名で、かなり便利で便利です。
カスタムデータベース設定をどのように適用できるかを示すために、例に@Import(MyPersistenceConfiguration.class)を追加しました。

7
naXa

プロフィールを介してそれを制御するもう一つの方法はこれです:

// 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 {

    }
}
0
Dirk

上記の解決策をすべて実行しても、このエラーが発生していました。

 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;

ついに私はSUCCESSFULをビルドしました。あなたが同じ問題に遭遇したかもしれないそれをチェックしてください

0
tadtab