2016-02-07 10 views
5

Ich habe eine Frühlings-Boot-Anwendung mit unterschiedlichem Profilaufbau: dev, prod, qc, console usw.Frühling Boot-Konfiguration überspringen Registrierung auf mehreren @Profile

Die beiden Konfigurationsklassen Setup sind wie folgt. MyConfigurationA sollte für alle Profile außer console registriert werden. MyConfigurationB sollte mit Ausnahme von console und dev registriert werden. Wenn ich die Anwendung mit dem Profil console starte, wird die MyConfigurationA nicht registriert - was in Ordnung ist. Aber MyConfigurationB wird registriert - was ich nicht will. Ich habe die @Profile Annotation wie folgt eingerichtet, um die MyConfigurationB für Profil console und dev nicht zu registrieren.

Aber die MyConfigurationB wird registriert, wenn ich die Anwendung mit Profil console ausführen.

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

der Dokumentation (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html) hat ein Beispiel eines Profils des mit und ohne Berücksichtigung der anderen Seite. In meinem Beispiel beide ich ohne als @Profile({"!p1", "!p2"}):

@Profile ({ "p1", "! P2"}), wird Registrierung auftreten, wenn Profil 'p1' aktiv ist OR wenn profile 'p2' ist nicht aktiv.

Meine Frage ist: Wie können wir Registrierung der Konfigurationen beider Profile überspringen? @Profile({"!p1", "!p2"}) macht OR-Operation. Wir brauchen AND-Operation hier.


Der Code:

@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"; 
    ... 
} 

Antwort

8

@Profile({"!console", "!dev"}) Mittel (nicht trösten) OR (NOT dev), die wahr ist, wenn Sie Ihre Anwendung mit dem Profil 'Konsole' laufen.
Um dies zu lösen Sie eine benutzerdefinierte Condition erstellen:

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

Und die Bedingung über die @Conditional Anmerkung zur Konfiguration gelten:

@Conditional(NotConsoleAndDevCondition.class) 
public class MyConfigurationB { 
+0

Das ist richtig !! Vielen Dank.. – gtiwari333

Verwandte Themen