Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring Boot中禁用所有与数据库相关的自动配置_Spring_Hibernate_Spring Boot_Spring Data_Spring Data Jpa - Fatal编程技术网

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

在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

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

我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接。应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring数据或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

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

我做类似事情的方式是:

@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 Actuator
org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration
也可以初始化数据源。

可能会有所帮助。您可以公开您的代码/配置吗?您还可以使用构建工具配置文件,并仅在其中一个配置文件上添加与数据相关的依赖项。如果您使用其他配置文件打包应用程序,由于类路径上没有所需的启动程序包,因此不会自动配置
@SpringBootApplication
具有
排除
属性,不需要
ClientAppConfiguration
。您可以在不使用ClientAppConfiguration的情况下基于活动配置文件排除条件吗?可以。您需要在
@springboot应用程序中排除
,然后在特定的包中创建一个
@Configuration
类,该类执行相关类的
@导入
,并且依赖于
@Profile
@Conditional
。这样,您就可以测试每个应用程序层,而不会让自动配置泄漏到整个应用程序中。想测试DB吗?只要扫描数据库包,配置一个模拟数据库,就可以了。我使用的是flyway。。我的服务器出故障了