【问题标题】:Custom Auto Configuration in Spring Boot cannot find DataSource with ConditionalOnBeanSpring Boot 中的自定义自动配置无法使用 ConditionalOnBean 找到 DataSource
【发布时间】:2018-11-06 23:31:11
【问题描述】:

我对 Spring Boot 2.0.1.RELEASE 版本有疑问(在 Spring Boot 2.0.0.RELEASE 中,以下配置运行良好)。

有人可以帮我看看为什么这个配置不起作用吗? 我有这个配置,这个配置与ConditionalOnBean 条件不匹配。

AutoConfigureOrder / Order / AutoConfigureAfter 好像没有任何作用。

@Configuration
@ConditionalOnClass({DataSource.class, JpaRepository.class})
@ConditionalOnBean(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@AutoConfigureOrder(LOWEST_PRECEDENCE)
@Order(LOWEST_PRECEDENCE)
public class MyJpaAuditAutoConfiguration {

    @ConditionalOnMissingBean
    @Bean
    public MyTransactionHelper transactionHelper() {
        return new MyTransactionHelper();
    }

}

spring.factories 我有:

     org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.example.MyJpaAuditAutoConfiguration

此配置的应用程序启动输出:

DataSourceAutoConfiguration matched:
  - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

...

JpaAuditAutoConfiguration:
  Did not match:
     - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans of type javax.sql.DataSource (OnBeanCondition)
  Matched:
     - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.data.jpa.repository.JpaRepository'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
     - @ConditionalOnProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition)

在我看来,配置类是在DataSourceAutoConfiguration 之前评估的,这就是找不到 bean 的原因。 DataSourceHealthIndicatorAutoConfiguration 等其他配置找到了 bean。

DataSourceHealthIndicatorAutoConfiguration matched:
  - @ConditionalOnClass found required classes 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
  - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition)
  - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource' (OnBeanCondition)

【问题讨论】:

  • 您是否尝试删除 @Order@AutoConfigureOrder
  • 实际上我从没有这些开始并添加了希望有帮助,所以有或没有这些都行不通。
  • 想知道您是否最终找到了解决此问题的方法?我遇到了一个非常相似的问题(但使用 JMS ConnectionFactory 而不是 DataSource)。
  • 请查看我的答案以获取可能的解决方案。

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


【解决方案1】:

spring boot 升级到2.1.2.RELEASE版本后自动解决了。

(我在答案中重命名了一些类)

所以在Spring Boot version 2.1.2.RELEASE:

@Configuration
@ConditionalOnBean(DataSource.class)
@ConditionalOnClass({DataSource.class, JpaRepository.class})
@ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class JpaTransactionHelperAutoConfiguration {

    @ConditionalOnMissingBean
    @Bean
    public TransactionHelper transactionHelper() {
        return new TransactionHelper();
    }

}

注意:删除 @AutoConfigureAfter(DataSourceAutoConfiguration.class) 后,它将在 Spring Boot 版本 2.1.2.RELEASE 中不起作用。

Spring Boot version 2.0.1.RELEASE我刚刚删除了ConditionalOnBean注解:

@Configuration
@ConditionalOnClass({DataSource.class, JpaRepository.class})
@ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class JpaTransactionHelperAutoConfiguration {

    @ConditionalOnMissingBean
    @Bean
    public TransactionHelper transactionHelper() {
        return new TransactionHelper();
    }

}

【讨论】:

  • 我在一些遗留应用程序中使用 v1.5.12.RELEASE。不幸的是,这些解决方案都不适用于这里。 :-(
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多