web-dev-qa-db-ja.com

Spring Boot Configurationは複数の@Profileで登録をスキップします

異なるプロファイル設定のSpring Bootアプリケーションを使用しています:devprodqcconsoleなど。

2つの構成クラスは、次のようにセットアップされます。 MyConfigurationAは、consoleを除くすべてのプロファイルに登録する必要があります。 MyConfigurationBは、consoledevを除いて登録する必要があります。

プロファイルconsoleを使用してアプリケーションを実行すると、MyConfigurationAが登録されません。これで問題ありません。しかし、MyConfigurationBは登録されます-これは望ましくありません。プロファイルMyConfigurationBおよびconsoledevを登録しないように、次のように_@Profile_アノテーションを設定しました。

しかし、プロファイルMyConfigurationBを使用してアプリケーションを実行すると、consoleが登録されます。

_@Profile({ "!" + Constants.PROFILE_CONSOLE ,  "!" + Constants.PROFILE_DEVELOPMENT })
_

ドキュメント( http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html )には、1つのプロファイルと他を除く。私の例では、両方を@Profile({"!p1", "!p2"}):として除外しています

@Profile({"p1"、 "!p2"})、プロファイル 'p1'がアクティブな場合に登録が行われます[〜#〜]または[〜#〜]プロファイル「p2」がアクティブでない場合。

私の質問は:両方のプロファイルの構成の登録をスキップするにはどうすればよいですか? @Profile({"!p1", "!p2"})は、OR演算を実行しています。ここではAND演算が必要です。


コード :

_@Configuration
@Profile({ "!" + Constants.PROFILE_CONSOLE  })
public class MyConfigurationA {
    static{
        System.out.println("MyConfigurationA registering...");
    }
}

@Configuration
@Profile({ "!" + Constants.PROFILE_CONSOLE ,  "!" + Constants.PROFILE_DEVELOPMENT }) // doesn't exclude both, its OR condition
public class MyConfigurationB {
    static{
        System.out.println("MyConfigurationB registering...");
    }
}

public final class Constants {
    public static final String PROFILE_DEVELOPMENT = "dev";
    public static final String PROFILE_CONSOLE = "console";
    ...
}
_
18
gtiwari333

@Profile({"!console", "!dev"})は(コンソールではない)[〜#〜]または[〜#〜]を意味します(devではありません)。プロファイル「console」を使用してアプリを実行します。
これを解決するには、カスタムを作成します 条件

public class NotConsoleAndDevCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        return !environment.acceptsProfiles("console", "dev");
    }
}

そして、設定に @ Conditional アノテーションを介して条件を適用します。

@Conditional(NotConsoleAndDevCondition.class)
public class MyConfigurationB {
25
Cyril

Springの新しいバージョンでは、文字列を受け入れるacceptsProfilesメソッドは廃止されました。

Cyrilの質問 と同等の作業を行うには、 新しいメソッドパラメーター を利用する必要があります。この新しい形式では、以前に存在していたものよりも強力なプロファイル式を作成する柔軟性も提供されるため、acceptsProfiles式全体を否定する必要がなくなります。

public class NotConsoleAndDevCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        return environment.acceptsProfiles(Profiles.of("!console & !dev"));
    }
}
3
Makoto

プロファイルアノテーションで式を使用できます。詳細はドキュメント here をご覧ください。例:

@Configuration
@Profile({ "!console & !dev" }) 
public class MyConfigurationB {
    static{
        System.out.println("MyConfigurationB registering...");
    }
}
1
xyz