@ConditionalOnProperty由扩展NestedCondition的类实现的内部接口类

时间:2017-08-25 03:33:18

标签: java spring spring-boot

所以这种方法可能不可行,而且我误解了这种结构。

我使用的是Spring,我有一个界面,我想用它来进行两种不同类型的@Conditional检查。我声明了我的内部类并指定了我正在寻找的@ConditonalOnProperty环境值。

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

public interface CloudEnvironments {
    @ConditionalOnProperty(name = "spring.profiles.active", havingValue = "dev")
    class IsDev {}

    @ConditionalOnProperty(name = "spring.profiles.active", havingValue = "stage")
    class IsStage {}

    @ConditionalOnProperty(name = "spring.profiles.active", havingValue = "prod")
    class IsProd {}
}

然后我创建了我的类,它扩展了相应的Spring NestedCondition。检查任何匹配的环境(云)和环境无匹配的环境(本地)

import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
import org.springframework.boot.autoconfigure.condition.NoneNestedConditions;

public class EnvironmentConditional {
    public static class AnyCloud extends AnyNestedCondition implements CloudEnvironments {
        public AnyCloud() {
            super(ConfigurationPhase.PARSE_CONFIGURATION);
        }
    }

    public static class NotCloud extends NoneNestedConditions implements CloudEnvironments {
        public NotCloud() {
            super(ConfigurationPhase.PARSE_CONFIGURATION);
        }
    }
}

然后我在我的自定义DataSource

中实现它
@Configuration
@Conditional(EnvironmentConditional.AnyCloud.class)
public class CloudDataSource {
    @Bean
    public DataSource stuff(){
        /** CODE **/
    }
}

不幸的是,当我运行App时,显示所有条件匹配

- AnyNestedCondition 0 matched 0 did not (EnvironmentConditional.AnyCloud)

意思是它没有看到任何@ConditionalOnProperty检查。 (如果我把它拉到一个水平,我可以做这个工作,我很好奇,如果我能用这种方式让它更干)。

我有一个静态的内部阶级实现了另一个内部阶级......而且它似乎已经过深了。

我是否可以轻易搞定逻辑中的失误,以及是否有一种方法可以让我在利用Spring的NestedConditions的同时为每个环境提供一个@ConditonalOnProperty。

1 个答案:

答案 0 :(得分:0)

我尝试了这样的尝试,我能够决定匹配条件。 我们也可以简单地使用@Profile("cloud")来启用特定于配置文件的bean

public class EnvironmentConditional {
    public static class AnyCloud extends SpringBootCondition implements CloudEnvironments {


        @Override
        public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {

            Environment env=context.getBeanFactory().getBean(Environment.class);
            for( String profile : env.getActiveProfiles()){
                switch(profile){

                case "dev" : return new ConditionOutcome(true, "Matched"); 
                case "prod" : return new ConditionOutcome(false, "UnMatched"); 
                }
            }
            return new ConditionOutcome(true, "Matched");
        }
    }

    public static class NotCloud extends NoneNestedConditions implements CloudEnvironments {
        public NotCloud() {
            super(ConfigurationPhase.PARSE_CONFIGURATION);
        }
    }
}

另外看一下,

@ConditionalOnCloudPlatform

Doc link