異なるプロファイル設定のSpring Bootアプリケーションを使用しています:dev
、prod
、qc
、console
など。
2つの構成クラスは、次のようにセットアップされます。 MyConfigurationA
は、console
を除くすべてのプロファイルに登録する必要があります。 MyConfigurationB
は、console
とdev
を除いて登録する必要があります。
プロファイルconsole
を使用してアプリケーションを実行すると、MyConfigurationA
が登録されません。これで問題ありません。しかし、MyConfigurationB
は登録されます-これは望ましくありません。プロファイルMyConfigurationB
およびconsole
のdev
を登録しないように、次のように_@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";
...
}
_
@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 {
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"));
}
}
プロファイルアノテーションで式を使用できます。詳細はドキュメント here をご覧ください。例:
@Configuration
@Profile({ "!console & !dev" })
public class MyConfigurationB {
static{
System.out.println("MyConfigurationB registering...");
}
}