Springboot-- Как использовать @Profile со значением, имеющим регулярное выражение? - PullRequest
1 голос
/ 30 апреля 2020

У меня есть класс в моем проекте Springboot Maven. Я хочу аннотировать класс с помощью @Profile таким образом, чтобы этот класс не настраивался для какого-либо профиля, оканчивающегося на '-test'.

Класс ConfigureData находится в /main.

В моем / каталог test, у меня есть пара классов тестов, помеченных @ActiveProfiles как «unit-test», «интеграционный тест», «функциональный тест», «системный тест» и т. д. c.

Я пытаюсь что-то вроде ниже, чтобы игнорировать автоматическую настройку класса 'ConfigureData' для всех профилей, заканчивающихся на '-test', но это не работает!

Есть ли способ добиться этого с помощью некоторого регулярного выражения без указания имени каждого профиля теста в @Profile?

@Configuration
@Profile("!.*-test")
public class ConfigureData {

}

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Я не могу сказать, что для SPeL я знаю, что он поддерживает Regex с "совпадениями" (специальным словом), однако я думаю, что это слишком fr agile, поэтому я предлагаю другой способ: Использовать Условное с пользовательским условием.

Фактически @Profile, представленный в Spring 3.x, был переписан весной 4 для реализации с более гибким «условным подходом».

Взгляните на исходный код аннотации профиля:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {

    /**
     * The set of profiles for which the annotated component should be registered.
     */
    String[] value();

}

Обратите внимание, что Профиль реализован как «Условный» и имеет настраиваемое условие, которое проверяет все запущенные в настоящий момент профили и решает, соответствует ли условие.

Вот реализация Условия весной 4:

class ProfileCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if (context.getEnvironment() != null) {
            MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
            if (attrs != null) {
                for (Object value : attrs.get("value")) {
                    if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
                        return true;
                    }
                }
                return false;
            }
        }
        return true;
    }

}

Таким образом, вы можете создать свою собственную аннотацию, такую ​​как @Production, с вашим пользовательским условием, которое проверяет профили и, если вы тестируете, - не совпадают или что-то в этом роде.

Затем введите @Production в конфигурацию (класс ConfigureData в вопросе), и все готово!

1 голос
/ 30 апреля 2020

Не думаю, что подстановочные знаки поддерживаются в выражении профиля. В профиле @Profile можно упомянуть о нескольких профилях, которые поддерживают только поддерживаемые операторы.

В официальной документации Spring указано,

В выражениях профиля поддерживаются следующие операторы:

! - A logical not of the profile
& - A logical and of the profiles
| - A logical or of the profiles

Полную информацию можно найти здесь, https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/env/Profiles.html#of - java .lang.String ...-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...