在Spring Boot中禁用所有与数据库相关的自动配置
我正在使用SpringBoot开发两个应用程序,一个用作服务器,另一个用作客户端应用程序。然而,它们都是同一个应用程序,根据活动配置文件的不同功能不同。我正在使用SpringBoot的自动配置功能来配置我的应用程序 我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接。应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring数据或Hibernate功能。数据库自动配置的启用或禁用应是有条件的,并基于应用程序的活动配置文件 我可以通过为各自的配置文件创建两个不同的application.properties文件来实现这一点吗 我试着把它添加到我的属性文件中在Spring Boot中禁用所有与数据库相关的自动配置,spring,hibernate,spring-boot,spring-data,spring-data-jpa,Spring,Hibernate,Spring Boot,Spring Data,Spring Data Jpa,我正在使用SpringBoot开发两个应用程序,一个用作服务器,另一个用作客户端应用程序。然而,它们都是同一个应用程序,根据活动配置文件的不同功能不同。我正在使用SpringBoot的自动配置功能来配置我的应用程序 我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接。应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring数据或Hibernate功能。数据库自动配置的启用或禁用应是有条件的,并基于应用程序的活动配置文件 我可以通过为各自的配置文件创建两个不同的a
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
但是,应用程序仍然会在启动时尝试连接到数据库。这些除外责任是否足以满足我的要求?我做类似事情的方式是:
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
//it can be left blank
}
为服务器应用程序编写类似的应用程序(不包括排除项)
最后一步是从主spring引导类禁用自动配置:
@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
这应该可以完成任务。现在,我在示例中排除的依赖项可能不完整。它们对我来说已经足够了,但我不确定是否完全禁用与数据库相关的库。检查以下列表以确保:
希望这会有所帮助看起来你只是忘记了用逗号来分隔类。因此,根据您的配置,以下各项将起作用:
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
我的出路是增加
@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);
}
}
要禁用所有与数据库相关的自动配置并退出: 无法为数据库类型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);
}
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
2。使用Application.properties:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(PayPalApplication.class, args);
}
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
即使我做了上面提到的所有解决方案,我也会犯这个错误
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>
org.springframework.boot
spring引导启动器数据jpa
Pojo类具有以下导入
import javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.Id代码>
这清楚地表明应用程序需要一个数据源
我所做的是从pom中删除JPA依赖项,并用以下内容替换pojo的导入
import org.springframework.data.annotation.Id;
导入org.springframework.data.mongodb.core.mapping.Document代码>
最后我成功地完成了构建。检查一下您可能遇到了相同的问题有一种方法可以使用注释排除特定的自动配置类
@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(排除={
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
公共类myspringbootplication{
公共静态void main(字符串[]args){
run(MySpringBootApplication.class,args);
}
}
@SpringBootApplication#exclude
属性是@EnableAutoConfiguration#exclude
属性的别名,我觉得它非常方便和有用。
我在示例中添加了@Import(MyPersistenceConfiguration.class)
,以演示如何应用自定义数据库配置。通过配置文件控制它的另一种方法是:
// 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 {
}
}
我在@SpringBootApplication之后添加了myApp.java
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,hibernatejpaaautoconfiguration.class})
改变
@SpringBootApplication=>@Configuration
所以,我的主类(myApp.java)中有这个
}
为我工作!=) 我在这里遇到了同样的问题,解决方法如下:
只需添加另一个应用程序-{yourprofile}.yml
,其中“yourprofile”可以是“client”
在我的例子中,我只是想删除开发概要文件中的Redis,所以我在主application.yml
旁边添加了一个application-Dev.yml
,它完成了这项工作
在这个文件中,我提出:
spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
这也适用于属性文件
我喜欢这样一个事实,即无需更改应用程序代码即可做到这一点。如果您使用Spring Actuatororg.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration
也可以初始化数据源。可能会有所帮助。您可以公开您的代码/配置吗?您还可以使用构建工具配置文件,并仅在其中一个配置文件上添加与数据相关的依赖项。如果您使用其他配置文件打包应用程序,由于类路径上没有所需的启动程序包,因此不会自动配置@SpringBootApplication
具有排除
属性,不需要ClientAppConfiguration
。您可以在不使用ClientAppConfiguration的情况下基于活动配置文件排除条件吗?可以。您需要在@springboot应用程序中排除,然后在特定的包中创建一个@Configuration
类,该类执行相关类的@导入
,并且依赖于@Profile
或@Conditional
。这样,您就可以测试每个应用程序层,而不会让自动配置泄漏到整个应用程序中。想测试DB吗?只要扫描数据库包,配置一个模拟数据库,就可以了。我使用的是flyway。。我的服务器出故障了