首页 > 解决方案 > Spring Boot @ConditionalOnProperty 不加载 bean

问题描述

我正在尝试实现一项服务,该服务将基于env变量使用两个不同的存储库。

基于这篇文章:https ://reflectoring.io/dont-use-spring-profile-annotation/

我想使用带@ConditionalOnProperty注释的配置在启动时加载适当的实现。

我所做的一切都与文章中的完全一样,但是 spring 抛出了一个异常,说 bean 没有定义:

Description:

Parameter 0 of method myService in com.adam.MyServiceConfiguration required a bean of type 'com.adam.MyRepository' that could not be found.


Action:

Consider defining a bean of type 'com.adam.MyRepository' in your configuration.


Process finished with exit code 0

下面是服务的配置:

@Configuration
class MyServiceConfiguration {
    @Bean
    fun mySerivce(myRepository: MyRepository) = MyService(myRepository)
}

这是存储库 bean 的配置:

@Configuration
class DataSourceConfiguration {

    @Bean
    @ConditionalOnProperty(
        prefix = "datasource",
        name = ["mock"],
        havingValue = "false",
        matchIfMissing = true
    )
    fun myRepository(httpClient: HttpClient): MyRepository =
        HttpRepository(httpClient)

    @Bean
    @ConditionalOnProperty(
        prefix = "datasource",
        name = ["mock"],
        havingValue = "true"
    )
    fun myRepository(): MyRepository = InMemoryRepository()
}

谁能看到我做错了什么?我为此苦苦挣扎了好几个小时。

我尝试使用@DependsOn,但错误是没有定义该名称的bean。

我还启用了日志记录,如果我没看错,应该正确解析 bean:

   My#repository:
      Did not match:
         - @ConditionalOnProperty (datasource.mock=false) found different value in property 'mock' (OnPropertyCondition)
      Matched:
         - @ConditionalOnProperty (datasource.mock=true) matched (OnPropertyCondition)

标签: javaspring-bootkotlinconfigurationconditional-statements

解决方案


您有两个在一个类上@Bean命名的方法。这意味着有两种不同的方法都定义了一个名为. 这会混淆 Spring Framework 的条件评估,如本期所述。混淆意味着在定义单个bean 时评估这两种方法的条件。您的两个条件是互斥的,因此没有定义任何 bean。myRepository@ConfigurationmyRepositorymyRepository()myRepository

您可以通过确保您的两个@Bean方法具有不同的名称来解决此问题。例如,您可以命名它们httpRepository并且inMemoryRepository.


推荐阅读