Пользовательская автоматическая конфигурация в Spring Boot не может найти источник данных с помощью ConditionalOnBean - PullRequest
0 голосов
/ 28 мая 2018

У меня проблема с 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)

По моему мнению,класс 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 Ответ

0 голосов
/ 16 февраля 2019

После весеннего обновления до версии 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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...