2017-08-25 22 views
0

このアプローチは実行可能ではないかもしれませんが、私は構造を誤解しています。@ConditionalOnProperty NestedConditionを拡張するクラスによって実装されたインターフェイスの内部クラス

私はSpringを使用していますが、私は2つの異なるタイプの@条件チェックに使用したいインターフェイスがあります。内部クラスを宣言し、私が探している@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を拡張するmyクラスを作成します。残念ながら、私が実行したときに一致するために、任意の環境(クラウド)をチェックし、環境の試合のNONE(ローカル)

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); 
     } 
    } 
} 

1、その後、私は私のカスタムデータソースに

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

をそれを実装ワンアプリケーションは、条件のすべてを表示する場合は、それが@ConditionalOnPropertyのチェックのいずれかを見ていない意味

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

一致しました。 (もし私がそれをもっと上げればこの仕事をすることができます、私はそれをもっと乾燥させることができれば好奇心が強いです)。

私は別の内部クラスを実装する静的な内部クラスを持っています...それは私があまりにも深く行っているようです。

私の失火のロジックを微調整して、SpringからのNestedConditionsを利用しながら各環境に単一の@ConditonalOnPropertyを持たせるアプローチがあるかどうかを知ることができます。

答えて

0

私はこのような試行をして、私は条件に一致することを決定することができました。

Doc link

+0

やっていることと思われる: 我々はまた、単に、@Profile("cloud")の使用は、プロファイル固有の豆また

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を作ることができますこれは私がCloudEnvironmentsインターフェイスを必要とせず、代わりにロジックをgetMatchOutcomeのレベルまで動かします。 残念ながら、このロジックはAnyCloudとNoCloudの条件付きチェックで重複していましたが、これは避けたいものでした。 – mcnichol

+0

私は自分の答えをちょうど更新したので、環境に基づいてどのクラウドもクラウドも判断できません。あなたのポイントは1レベル上で有効ですが – Barath

+0

@milkでもConditionalOnCloudPlatformを見ていますhttps://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/自動構成/条件/ ConditionalOnCloudPlatform.html – Barath

関連する問題