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


115

我正在使用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

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


可能会有所帮助。
Rahul Sharma

您可以透露您的代码/配置吗?
luboskrnac '16

2
您还可以使用构建工具概要文件,并仅在其中一个概要文件上添加与数据相关的依存关系。如果您的应用是使用其他配置文件打包的,则由于该类路径上没有所需的入门包,因此不会对其进行自动配置
Ali Dehghani

Answers:


99

我做类似事情的方式是:

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

为服务器应用程序编写类似的内容(不排除)。

最后一步是从主spring引导类禁用Auto Configuration:

@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。这样,您可以测试每个应用程序层,而不会自动配置泄漏到整个应用程序中。要测试数据库吗?只需扫描数据库包,配置模拟数据库,就可以了。
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#exclude属性是属性的别名@EnableAutoConfiguration#exclude,我觉得它非常方便和有用。
@Import(MyPersistenceConfiguration.class)在示例中添加了示例,以演示如何应用自定义数据库配置。


2
谢谢!这是最现代的答案。链接到这里:konstructcomputers.blogspot.com/2018/10/…–
约书亚·戴维斯

9

我的出路是添加

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

运行Spring Boot的类的注解(标有@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,其中“您的个人资料”可能是“客户”即可。

就我而言,我只是想在Dev配置文件中删除Redis,所以我application-dev.yml在main旁边添加了一个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支持全部从应用程序中删除,而是基于条件(例如Spring概要文件)启用/禁用它-而不更改代码或Maven项目配置。之所以得到与数据源相关的错误,是因为显然您忘记了定义和激活将加载“无数据源”配置而不是加载与DS / JPA相关的类的Spring配置文件。JPA库仍应保留在发行版中。
cvnew

1
我认为您没有完全阅读我的文章。在最后一行,我建议这可能是一个类似的问题,但并不是说答案就是这样
Tadele Ayelegn

0

我在@SpringBootApplication之后添加myApp.java

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

并改变了

@SpringBootApplication => @配置

因此,我在主类(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);
}

}

为我工作!=)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.