[英]Spring Boot Injection issue using several Profiles
我在 Spring 中使用 Profiles 时遇到问题,基本上我们使用它们来存根我们微服务的某些部分,它使用到 db 的连接和到另一个 web 服务的连接。
以前,我为 DB 和外部 webservice 使用了一个存根配置文件:
@Configuration
@EnableAutoConfiguration
@Profile("stub")
@ComponentScan(
basePackages = {"com.consumption.backend"},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.consumption.backend.*.persistence.*"),
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.consumption.backend.databackendapi.*")
})
public class StubConfiguration {
@Bean
public DataApi consumptionApi() { return new DataStubApi(); }
@Bean
public RefDayDao refDayDao() { return new RefDayInMemoryDao(); }
@Bean
public RefTypeHourDao refTypeHourDao() { return new RefTypeHourInMemoryDao(); }
}
这工作正常,但是我想将此存根分成两个存根,一个用于数据库,另一个用于外部网络服务,以确保我们的测试具有更大的灵活性。
DAO 的存根:
@Configuration
@EnableAutoConfiguration
@Profile("stubconfv3")
@ComponentScan(
basePackages = {"com.consumption.backend"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.consumption.backend.*.persistence.*")
)
public class StubConfV3Configuration {
@Bean
public RefDayDao refDayDao() { return new RefDayInMemoryDao(); }
@Bean
public RefTypeHourDao refTypeHourDao() { return new RefTypeHourInMemoryDao(); }
}
外部网络服务的存根:
@Configuration
@EnableAutoConfiguration
@Profile("stubdatabackend")
@ComponentScan(
basePackages = {"com.consumption.backend"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.consumption.backend.databackendapi.*")
)
public class StubDataBackendConfiguration {
@Bean
public DataApi consumptionApi() { return new DataStubApi(); }
}
DAO 的存根似乎工作正常,但是我似乎对外部 web 服务 API 有问题,但没有正确排除实现:
stub
配置文件启动我的应用程序,一切正常stubconfv3
和stubdatabackend
启动我的应用程序,我会遇到注入问题,因为找到了两个类:com.consumption.backend.service.DataService 中构造函数的参数 0 需要一个 bean,但找到了 2 个:
dataBackendApi:定义在文件[C:\\code\\consumption-backend\\databackend-api\\target\\classes\\com\\consumption\\backend\\databackendapi\\DataBackendApi.class]
消费Api:由类路径资源[com/consumption/backend/application/configuration/StubDataBackendConfiguration.class]中的方法'consumptionApi'定义
行动:
考虑将其中一个 bean 标记为 @Primary,更新消费者以接受多个 bean,或者使用 @Qualifier 来标识应该使用的 bean
要么排除不起作用,要么有一些棘手的事情,因为它似乎在目标中找到 .class 文件,而不是在运行时在类加载器中找到它
最有可能的是,我犯了一些愚蠢的错误并且没有看到它......
您可以尝试使用注释 DataBackendApi
@Profile("!stubdatabackend")
在不使用该配置文件时将其包含在内,否则将其排除
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.