Как получить пользовательское значение конфигурации, доступное в аннотации @ConditionalOnExpression

#spring #spring-boot #spring-boot-configuration

Вопрос:

Я пытаюсь включить определенные компоненты на основе «функциональности» для развертывания, такие как интерфейс rest, потребитель сообщений, индексатор, архиватор и портал администратора. В некоторых случаях приложение должно иметь все, некоторые или одну из «функций», таких как local, dev и qa, должны иметь все функции, но на этапе подготовки и производства функции должны быть разделены, чтобы они могли повысить производительность, например, память, потоки и т. Д…

Для этого я настроил пользовательскую конфигурацию на основе функций, передаваемых через командную строку. Я использую свойства конфигурации, чтобы определить, должна ли быть доступна каждая из «функций». У меня есть пользовательская конфигурация:

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "com.example.config.functionality")
public class FunctionalityConfig {

    public static final Logger LOGGER = LoggerFactory.getLogger(FunctionalityConfig.class);

    private boolean restInterface;

    private boolean messageConsumer;

    private boolean adminInterface;

    private boolean indexing;

    private boolean archive;

    public void setRestInterface(final boolean restInterface) {
        this.restInterface = restInterface;
    }

    public boolean isRestInterface() {
        return restInterface;
    }

    public void setMessageConsumer(final boolean messageConsumer) {
        this.messageConsumer = messageConsumer;
    }

    public boolean isMessageConsumer() {
        return messageConsumer;
    }

    ...
}
 

Тогда у меня есть пользовательская аннотация:

 ...

/**
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@ConditionalOnExpression("#{ functionalityConfig.isRestInterface }")
public @interface ConditionalOnRestInterface {
}

 

Но когда я добавляю его в определение компонента, подобное этому:

 @Component
@ConditionalOnRestInterface
public class RestInterface implements InitializingBean {

    private static final Logger LOGGER = LoggerFactory.getLogger(RestInterface.class);

    public void afterPropertiesSet() throws Exception {
        LOGGER.info("Rest Interface is available.");
    }
}

 

Я получаю следующую ошибку: Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'functionalityConfig' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?

Если я избавлюсь от @ConditionalOnExpression аннотации, все будет работать, дополнительно:

в классе приложений у меня есть следующие строки:

     @Value("#{functionalityConfig.restInterface}")
    public boolean restInterface;
 

И они работают идеально. Я пытаюсь понять, почему @ConditionalOnExpression он не берет трубку. Я даже добавил @EnableConfigurationProperties(FunctionalityConfig.class) аннотацию в приложение, но исключение не изменилось.

Комментарии:

1. Вы пробовали добавить @DependsOn({"functionalityConfig"}) в ConditionalOnRestInterface ? Здесь это всего лишь предположение. Честно говоря, ваш код, похоже, должен работать.

2. Предполагая, что первый вариант не сработал, можете ли вы также попробовать @ConditionalOnExpression("#{ systemProperties['com.example.config.functionality.restInterface'] }") ?