#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'] }")
?