代码之家  ›  专栏  ›  技术社区  ›  Nagy Attila

Spring引导中的自定义自动配置找不到ConditionAlonBean的数据源

  •  1
  • Nagy Attila  · 技术社区  · 8 年前

    我的SpringBoot2.0.1.release有问题(在SpringBoot2.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)
    

    在我看来,config类是在 DataSourceAutoConfiguration 这就是为什么豆子找不到的原因。 其他配置,如 DataSourceHealthIndicatorAutoConfiguration 找到了豆子。

    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)
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Nagy Attila    7 年前

    在Spring引导升级到版本之后 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) 在2.1.2.release版本的Spring引导中无法工作。

    在 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();
        }
    
    }
    
    推荐文章