2016-02-07 51 views
5

Ho un'applicazione di avvio di primavera con diversa configurazione Profilo: dev, prod, qc, console eccconfigurazione di avvio primavera saltare la registrazione su più @profile

Le due classi di configurazione sono impostati come segue. MyConfigurationA deve essere registrato per tutti i profili eccetto console. MyConfigurationB deve essere registrato ad eccezione di console e dev.

Quando eseguo l'applicazione con il profilo console, lo MyConfigurationA non viene registrato, il che va bene. Ma viene registrato MyConfigurationB - che non voglio. Ho impostato l'annotazione @Profile come segue per non registrare lo MyConfigurationB per il profilo console e dev.

Ma il MyConfigurationB viene registrato quando si esegue l'applicazione con il profilo console.

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

La documentazione (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html) presenta un esempio di includere un profilo ed escludendo l'altra. Nel mio esempio sto escludendo sia come @Profile({"!p1", "!p2"}):

@profile ({ "P1", "! P2"}), la registrazione si verifica se profilo 'P1' è attivo O se il profilo 'P2' non è attivo

La mia domanda è: Come possiamo ignorare la registrazione delle configurazioni di entrambi i profili? @Profile({"!p1", "!p2"}) sta facendo un'operazione OR. Abbiamo bisogno dell'operazione AND qui.


Il codice:

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

risposta

8

@Profile({"!console", "!dev"}) mezzi (NON console) OR (NON DEV) che è vero se si esegue la vostra applicazione con il profilo di 'console'.
per risolvere questo è possibile creare un custom Condition:

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

e applicare la condizione attraverso la @Conditional annotazioni alla Configurazione:

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

Proprio così !! Grazie.. – gtiwari333

Problemi correlati