如何在单类SpringBoot中同时配置EnableConfigurationProperties和ConditionalOnProperty

问题描述 投票:0回答:1

这就是 SpringConfiguration 所做的

@Configuration
@Import({
        DataLoad.class,
        Security.class
})
@EnableConfigurationProperties(DataAPI.class)
@ConditionalOnProperty(name = "db.checkEnableed", havingValue = "true", matchIfMissing = true)
public class ApplicationConfiguration {

    @Bean
    DataLoadService checkDataLoad() {
        return new DataLoadService();
    }
}

所以我尝试按照提到的那样修改我的课程,它在 true 中工作正常

db.checkEnableed
属性。问题是如果
db.checkEnableed
为假,我的应用程序将无法启动,它会给出以下错误
Description: Parameter 0 of constructor in com.data.DataLoad required a bean of type DataAPI.class  Action :- Consider defining a bean of type 'DataAPI' in your configuration.
所以这意味着即使
db.checkEnableed
为假,它仍然会尝试加载
@Import
注释中提到的类。任何人都可以帮助解决这个问题。谢谢

db.checkEnableed
为假或缺失时,我需要修复此异常。

java spring spring-boot spring-annotations
1个回答
0
投票

当属性

db.checkEnableed
设置为
false
或缺失时,
ApplicationConfiguration
类不会被加载,因为
@ConditionalOnProperty
注解。但是,
DataLoad
注释中提到的
Security
@Import
仍将由 Spring 容器加载,这会导致您看到的错误。

您可以求助于将

@Conditional
注释与将禁用
ApplicationConfiguration
及其
@Import
ed 类型的编程条件配对:

@Configuration
@Import({
        DataLoad.class,
        Security.class
})
@EnableConfigurationProperties(DataAPI.class)
@Conditional(DbEnabledCondition.class)
public class ApplicationConfiguration {

    @Bean
    DataLoadService checkDataLoad() {
        return new DataLoadService();
    }
}

public class DbEnabledCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return Boolean.parseBoolean(context.getEnvironment().getProperty("db.checkEnableed", "true"));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.