【发布时间】: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