Spring Boot @ConditionalOnProperty 不加载 bean
Spring Boot @ConditionalOnProperty doesn't load 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)
您在一个 @Configuration
class 上有两个名为 myRepository
的 @Bean
方法。这意味着有两种不同的方法都定义了一个名为 myRepository
的 bean。这混淆了 Spring 框架的条件评估,如 this issue 中所述。混淆意味着在定义单个 myRepository
bean 时评估两个 myRepository()
方法的条件。你的两个条件是互斥的,所以没有定义bean。
您可以通过确保两个 @Bean
方法具有不同的名称来解决此问题。例如,您可以将它们命名为 httpRepository
和 inMemoryRepository
.
我正在尝试实施一项服务,该服务将根据 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)
您在一个 @Configuration
class 上有两个名为 myRepository
的 @Bean
方法。这意味着有两种不同的方法都定义了一个名为 myRepository
的 bean。这混淆了 Spring 框架的条件评估,如 this issue 中所述。混淆意味着在定义单个 myRepository
bean 时评估两个 myRepository()
方法的条件。你的两个条件是互斥的,所以没有定义bean。
您可以通过确保两个 @Bean
方法具有不同的名称来解决此问题。例如,您可以将它们命名为 httpRepository
和 inMemoryRepository
.