@ConditionalOnExpression не работает, но работает @Value

Мне нужно включить/отключить @Aspect для класса в приложении Spring (не загрузочном).

Весенняя версия: 4.1.6.RELEASE

У меня есть файл .properties (что мы уже успешно используем в другой точке приложения, например для выбора конфигурационного файла log4j2) со свойством aspect.enabled=true|false, и я попытался использовать аннотацию @ConditionalOnExpression, чтобы включить|отключить его.

Это моя попытка:

файл application.properties:

aspect.enabled=true

Код класса:

@Configuration
@PropertySource(ignoreResourceNotFound = true, value = { "file:${catalina.home}/conf/application.properties" })
@ConditionalOnExpression("'${aspect.enabled}'=='true'")
@Aspect
@Component
public class TimingProfilerProduction {

    @Value("${aspect.enabled}")
    public String aspect;

В этой конфигурации выражение всегда оценивается как ложный.

Я попытался поставить одно «true», чтобы увидеть, работает ли он таким простым способом:

@Configuration
@PropertySource(ignoreResourceNotFound = true, value = { "file:${catalina.home}/conf/application.properties" })
@ConditionalOnExpression("true")
@Aspect
@Component
public class TimingProfilerProduction {

    @Value("${aspect.enabled}")
    public String aspect;

Конечно, таким образом @ConditionalOnExpression оценивается как true, и я также могу доказать, что свойство класса аспект правильно считывает свойство аспект.включен.

Попробуйте №3

Я пробовал с @ConditionalOnProperty:

@Configuration
@PropertySource(ignoreResourceNotFound = true, value = { "file:${catalina.home}/conf/application.properties" })
@ConditionalOnProperty(prefix = "aspect", name = "enabled", havingValue = "true")

но ничего, всегда ложный.

Попробуйте №4:

@ConditionalOnExpression("${aspect.enabled}")

или

@ConditionalOnExpression("!${aspect.enabled}")

Выдает ошибку:

Caused by: org.springframework.expression.spel.SpelParseException: EL1041E:(pos 1): After parsing a valid expression, there is still more data in the expression: 'lcurly({)'

Попробуйте № 5 (со значениями по умолчанию):

@ConditionalOnExpression("${aspect.enabled:true}")

всегда выдает истинный (даже с aspect.enabled=false), и соответственно

@ConditionalOnExpression("${aspect.enabled:false}")

всегда дает ложный

Вы пробовали @ConditionalOnProperty?

Grzegorz Oledzki 05.02.2019 22:05

Да, @GrzegorzOledzki, я пробовал, но ничего (попробуй №3)

frankieta 06.02.2019 12:34

@ConditionalOnProperty(value = "aspect.enabled", matchIfMissing = false, haveValue = "true") вы пробовали так?

Ermintar 06.02.2019 12:38

@Ermintar прав, проверьте пример здесь

VijayD 06.02.2019 12:39

Нет, я не использовал эту точную формулировку, поэтому я обновлю вопрос соответствующим образом. Большое спасибо

frankieta 06.02.2019 12:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
5 486
1

Ответы 1

Вместо:

@ConditionalOnExpression("'${aspect.enabled}' == 'true'")

Пытаться:

@ConditionalOnExpression("${aspect.enabled} == true")

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