【问题标题】:Spring Boot @ConditionalOnProperty doesn't load beanSpring Boot @ConditionalOnProperty 不加载 bean
【发布时间】:2021-09-02 08:52:53
【问题描述】:

我正在尝试实现一个服务,它将使用基于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)

【问题讨论】:

    标签: java spring-boot kotlin configuration conditional-statements


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2014-06-09
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多