2016-02-07 3 views
5

У меня есть приложение загрузки Spring с различной настройкой профиля: dev, prod, qc, console и т.д.Spring конфигурация загрузки пропустить регистрацию на несколько @Profile

два класса конфигурации настроен следующим образом. MyConfigurationA должен быть зарегистрирован для всех профилей, кроме console. MyConfigurationB должны быть зарегистрированы, за исключением console и dev.

Когда я запускаю приложение с профилем console, MyConfigurationA не регистрируется - это нормально. Но регистрируется MyConfigurationB - чего я не хочу. Я установил аннотацию @Profile следующим образом, чтобы не зарегистрировать MyConfigurationB для профиля console и dev.

Но MyConfigurationB регистрируется при запуске приложения с профилем console.

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

документация (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html) имеет пример в том числе один профиль и исключая другой. В моем примере я кроме как в @Profile({"!p1", "!p2"}):

@Profile ({ "p1", "! P2"}), регистрация будет происходить, если профиль 'p1' активен ИЛИ, если профиль 'p2' не активен.

Мой вопрос: Как мы можем пропустить регистрацию конфигураций обоих профилей? @Profile({"!p1", "!p2"}) делает ИЛИ работа. Нам нужна операция И.


Код:

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

ответ

8

@Profile({"!console", "!dev"}) средства (НЕ утешать) ИЛИ (НЕ Dev), который является истинным, если вы запустите приложение с профилем 'консоли'.
Чтобы решить эту проблему вы можете создать собственный Condition:

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 { 
+0

Правильно !! Благодаря.. – gtiwari333

 Смежные вопросы

  • Нет связанных вопросов^_^