Spring Profile - Как включить условие И для добавления 2 профилей?

Я не хочу, чтобы загружался конкретный компонент, если активный профиль тестовый или локальный. Однако, когда я установил следующее, spring, кажется, обрабатывает как «или», и метод запускается как когда активный профиль - тестовый, так и локальный. Однако, если удалить, скажем, локально и сохранить тест, компонент не будет создан, когда профиль является тестовым.

@Profile({"!test","!local"})

Вам нужно использовать аннотации или вы можете использовать среду для получения свойств?

Compass 04.05.2018 21:20

Я должен использовать аннотации. свойство устанавливается в application.yml.

Punter Vicky 04.05.2018 21:22

Возможный дубликат Spring: как использовать И в профилях?

Compass 04.05.2018 21:27

@Compass В моем сценарии мне нужно использовать! Profile. Я предполагаю, что в связанном ответе НЕ используется.

Punter Vicky 04.05.2018 21:28

Единственный другой способ, о котором я могу думать, который не попадает в странное переписывание Spring, - это проверить профили, предоставленные перед запуском, и добавить дополнительный профиль специально для этого профиля, который обрабатывает это.

Compass 04.05.2018 21:29

Вы используете пружинный ботинок, и если да, то 1 или 2?

Compass 04.05.2018 21:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
7
5 839
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте @Profile({"Dummy"}).

Вы можете заменить "Dummy", если хотите использовать действительное имя профиля позже.

Спасибо @Sundarrajan. Но я хочу, чтобы это выполнялось для других профилей, таких как dev, qa или чего-либо еще, что я мог бы добавить в будущем.

Punter Vicky 04.05.2018 21:32
Ответ принят как подходящий

При использовании Spring Boot 1.X вы можете обновить свойство системы с помощью дополнительного имени профиля и обработать всю логическую логику перед вашим SpringApplication.run. Если он соответствует требованиям, вы должны добавить имя профиля к активным профилям. Если этого не произойдет, вы ничего не измените.

Это очень простая проверка, но вы можете добавить более строгую проверку профиля, такую ​​как нулевую проверку и фактическое разделение списка профилей.

    String profile = System.getProperty("spring.profiles.active");
    if (!profile.contains("test") && !profile.contains("local")) {
        System.setProperty("spring.profiles.active", profile + ",notdev");
    }

Если вы используете Spring Boot 2.0, вы можете использовать addAdditionalProfiles для добавления профиля (у меня нет приложения SB2, поэтому я не могу его протестировать, но я предполагаю, что он просто добавляет его в список свойств системы).

    String profile = System.getProperty("spring.profiles.active");
    if (!profile.contains("test") && !profile.contains("local")) {
        SpringApplication.addAdditionalProfiles("notdev");
    }

Тогда ваша аннотация может быть:

@Profile({"notdev"})

Начиная с Spring 5.1 (включен в Spring Boot 2.1), можно использовать выражение профиля внутри аннотации строки профиля. Так:

В Spring 5.1 (Spring Boot 2.1) и выше это так же просто, как:

@Component
@Profile("!test & !local")
public class MyComponent {}

Spring 4.x и 5.0.x:

Для этой версии Spring существует множество подходов, каждый из которых имеет свои плюсы и минусы. Когда не так много комбинаций, которые нужно охватить, мне лично нравится подход использования @Conditional, например @Stanislav ответил, в аналогичном вопросе. Я размещаю решение здесь для удобства читателя:

Ваш весенний боб:

@Component
@Conditional(value = { NotTestNorLocalProfiles.class })
public class MyComponent {}

Реализация NotTestNorLocalProfiles:

public class NotTestNorLocalProfiles implements Condition {
    @Override
    public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
        return !context.getEnvironment().acceptsProfiles("test")
                    && !context.getEnvironment().acceptsProfiles("local");
    }
}

В подобных вопросах можно найти другие подходы:

Как условно объявить Bean, когда несколько профилей неактивны?

Spring: как использовать И в профилях?

Другие вопросы по теме