java - 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)
解决方案
您有两个在一个类上@Bean
命名的方法。这意味着有两种不同的方法都定义了一个名为. 这会混淆 Spring Framework 的条件评估,如本期所述。混淆意味着在定义单个bean 时评估这两种方法的条件。您的两个条件是互斥的,因此没有定义任何 bean。myRepository
@Configuration
myRepository
myRepository()
myRepository
您可以通过确保您的两个@Bean
方法具有不同的名称来解决此问题。例如,您可以命名它们httpRepository
并且inMemoryRepository
.
推荐阅读
- xcode - 致命错误:找不到“矢量”文件,使用 Xcode 10
- jquery - Bootstrap 面板通过滚动将面板主体尺寸增加到固定长度
- vb.net - HtmlAgilityPack 行的 Xpath 语法
- jvm - win10如何通过netbeans8.2调试openjdk9?
- linux - 树莓派 Autostart.desktop 终端
- symfony - DQL 查询多对多 IN
- security - 如何限制项目管理员仅创建新存储库,azure devops 中的主分支
- c# - 具有相同属性存储库模式的多个实体
- jquery - 类中的文本应检查另一个类中的文本,如果匹配,则更改第一个文本的 css 样式
- python - 如何操作字符串中间的文本?