繁体   English   中英

使用多个配置文件的 Spring Boot 注入问题

[英]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配置文件启动我的应用程序,一切正常
  • 如果我使用stubconfv3stubdatabackend启动我的应用程序,我会遇到注入问题,因为找到了两个类:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM