在Spring Boot中禁用所有与数据库相关的自动配置

时间:2016-04-03 15:21:18

标签: spring hibernate spring-boot spring-data spring-data-jpa

我使用Spring Boot开发两个应用程序,一个用作服务器,另一个用作客户端应用程序。但是,它们都是相同的应用程序,根据活动配置文件的功能不同。我正在使用Spring Boot的自动配置功能来配置我的应用程序。

我想在客户端应用上禁用所有与数据库相关的自动配置,因为它不需要数据库连接。应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring Data或Hibernate功能。启用或禁用数据库自​​动配置应该是有条件的,并且基于应用程序的活动配置文件。

我可以通过为各个配置文件创建两个不同的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

但是,应用程序仍然尝试在启动时连接到数据库。这些排除是否足以满足我的要求?

10 个答案:

答案 0 :(得分:68)

禁用所有与数据库相关的自动配置并退出:

  

无法确定数据库类型为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

答案 1 :(得分:59)

我会做类似的事情是:

@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

希望有所帮助

答案 2 :(得分:22)

好像你忘了用逗号来分隔类。因此,根据您的配置,以下内容将起作用:

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

答案 3 :(得分:9)

我的出路是添加

curl -X GET puppet.foo.com:8180/pdb/query/v4/reports -d 'limit=1' -d 'query=["=", "certname", "node.foo.com"]'

运行Spring引导的类的注释(标有`@SpringBootApplication)。

最后,它看起来像:

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

答案 4 :(得分:7)

有一种方法可以使用@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)来演示如何应用自定义数据库配置。

答案 5 :(得分:2)

我在这里遇到了同样的问题,像这样解决了:

只需添加另一个application-{yourprofile}.yml,其中“您的个人资料”可以是“客户”。

就我而言,我只是想在Dev配置文件中删除Redis,所以我在主application-dev.yml旁边添加了application.yml,就可以了。

在此文件中,我输入:

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

这也应该与属性文件一起使用。

我喜欢这样的事实,即无需更改应用程序代码即可。

答案 6 :(得分: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;

最后我获得了成功的构建。看看你可能遇到了同样的问题

答案 7 :(得分:0)

通过“个人档案”控制它的另一种方法是:

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

    }
}

答案 8 :(得分:0)

我在@SpringBootApplication之后添加myApp.java

  

@EnableAutoConfiguration(排除= {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);
}

}

为我工作! =)

答案 9 :(得分:0)

此外,如果您使用Spring Actuator org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration可能也在初始化DataSource。