ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

This 可能会有所帮助。
你能透露你的代码/配置吗?
您还可以使用构建工具配置文件并仅在您的配置文件之一上添加与数据相关的依赖项。如果您使用其他配置文件打包您的应用程序,因为它在类路径中没有所需的启动程序包,因此不会自动配置

M
MartyIX

我会做类似事情的方式是:

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

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

最后一步是从主 Spring Boot 类中禁用自动配置:

@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

希望有帮助


@SpringBootApplication 具有 exclude 属性,不需要 ClientAppConfiguration
您可以在不使用 ClientAppConfiguration 的情况下根据活动配置文件排除条件吗?
是的。您将在 @SpringBootApplication 中排除,然后在特定包中创建一个 @Configuration 类,该类执行相关类的 @Import 并依赖于 @Profile@Conditional。这样,您可以测试每个应用程序层,而不会在整个应用程序中泄漏自动配置。想测试数据库?只需扫描数据库包,配置一个模拟数据库,就可以了。
我正在使用 flyway.. 我的服务器失败,因为由于缺少配置,它无法初始化 flyway。我尝试添加 FlywayAutoConfiguration.FlywayConfiguration.class,但它不起作用。有任何想法吗? ^^
J
Jin Kwon

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

无法确定数据库类型 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 这是因为禁用 DataSource 自动配置的更改可能发生在您用于开发的 application.properties 版本中。产生式 application.properties 定义了 DataSource。因此,代码在开发和生产中是相同的。
@GustavoRodrigues 您无法使用属性禁用,因为 DataSourceAutoconfigurationCondition 是在类路径上可用的 DataSource 类上触发的。
J
Julien May

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

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

n
naXa stands with Ukraine

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


谢谢!这是最现代的答案。在此处链接到它:konstructcomputers.blogspot.com/2018/10/…
r
ryzhman

我的出路是添加

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

D
D-rk

通过配置文件控制它的另一种方法是:

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

    }
}

你能告诉我如何在WithDB和WithDB类中放置一个记录器,以便在我启动应用程序时打印一些消息。谢谢
B
Bojan Vukasovic

如果使用 application.yml

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

S
Sylvain

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

只需添加另一个 application-{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

这也适用于属性文件。

我喜欢不需要更改应用程序代码来做到这一点的事实。


C
Cássia Chagas

我在@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);
}

}

为我工作! =)


T
Tadele Ayelegn

即使我执行了上述所有解决方案,我也会收到此错误。

 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 库仍应保留在发行版中。
我认为您没有完全阅读我的帖子。在最后一行我建议这可能是类似的问题,但不是说这就是答案
V
Vity

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


u
user9869932

在我的情况下,spring-boot-starter-jpa 依赖项是从其他依赖项加载的。我这样做是为了禁用数据源:

使用 mvn dependency:tree 检查依赖树

[INFO] com.backend.app:crud-manager:jar:0.1-SNAPSHOT
[INFO] +- ...
[INFO] \- com.backend.app:crud-libraries:jar:0.1-SNAPSHOT:compile
[INFO]    +- org.springframework.boot:spring-boot-starter.data-jpa:jar:2.1.6.RELEASE:compile
[INFO]    +- ....

有一个子依赖。添加排除项

<dependency>
  <groupId>com.backend.app</groupId>
  <artifactId>crud-libraries</artifactId>
  <exclusions>
    <exclusion> 
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusion>
  </exclusions>
</dependency>

排除 Application 文件中的 DataSourceAutoConfiguration.class

import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;

// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...

确保 pom.xml 中没有 spring-boot-starter-jpa

** Apart,以防您还需要使其与 spring-boot-starter-batch 一起使用

在 BatchConfig 文件中:

// add extends DefaultBatchConfig
public class BatchConfig extends DefaultBatchConfig {

//add override
@Override
public void setDataSource(DataSource dataSource) {}