所以这种方法可能不可行,而且我误解了这种结构。
我使用的是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。
答案 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 :