通过配置文件禁用/删除Spring Boot数据源

时间:2018-10-03 20:07:55

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

使用spring boot yaml config,我有一个看起来像这样的数据源:

datasource:
  url: jdbc:postgresql://somehost/somedb
  username: username
  password: password
  hikari:
    connection-timeout: 250
    maximum-pool-size: 1
    minimum-idle: 0

我可以基于配置文件成功指向不同的数据库,但是我想设置一个根本不使用该数据源的配置文件。但是,当我使用该配置文件时,会得到以下信息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto-configured.

Reason: Failed to determine a suitable driver class

如何在某些配置文件中使用此数据源,而在其他配置文件中则不使用?

2 个答案:

答案 0 :(得分:1)

您可以使用`@Profile(“!dev”)批注来跳过特定配置文件的Bean

配置文件名称也可以使用NOT运算符作为前缀,例如“!dev”将其从个人资料中排除

来自文档here

如果给定的配置文件以NOT运算符(!)为前缀,则如果该配置文件无效,则将注册带注释的组件-例如,给定@Profile({“ p1”,“!p2”} ),如果配置文件“ p1”处于活动状态或配置文件“ p2”未处于活动状态,则会进行注册。

  

配置文件也可以用XML进行配置-标记具有“配置文件”属性,该属性采用适用配置文件的逗号分隔值:here

 <beans profile="dev">
  <bean id="devDatasourceConfig"
  class="org.baeldung.profiles.DevDatasourceConfig" />
</beans>

答案 1 :(得分:-1)

更改为:

spring: 
   datasource:
      url: jdbc:postgresql://somehost/somedb
      username: username
      password: password
      hikari:
         connection-timeout: 250
         maximum-pool-size: 1
         minimum-idle: 0

Springboot默认情况下与自动配置一起使用,但是您可以自定义排除某些自动配置类

编辑您的配置以跳过自动配置:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})

通过配置文件创建自己的数据源

@Bean
  @Profile("dev")
  DataSource dataSourceDevProfile(org.springframework.core.env.Environment environment) throws Exception {
     return DataSourceBuilder.create().url("").driverClassName("").password("").username("").build();
   }

@Bean
@Profile("!dev")
DataSource dataSourceNoDev(org.springframework.core.env.Environment environment) throws Exception {
    return DataSourceBuilder.create().url(environment.getProperty("spring.datasource.url")).driverClassName("").password(environment.getProperty("spring.datasource.password")).username(environment.getProperty("spring.datasource.username")).build();
}

或完全以编程方式

@Bean
DataSource dataSource2(org.springframework.core.env.Environment environment) throws Exception {
    if (environment.acceptsProfiles("dev")){
        //return datasource dev
    }else{
        //return datasource prod
    }