Использование языка выражений Spring для подтверждения, что свойство (со значениями, разделенными запятыми), загруженное из файла свойств, содержит «значение» - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующая проблема, у меня в весенней загрузке есть определенный класс конфигурации, который содержит bean-компоненты, которые я хотел бы создать, только если определенное свойство, имеющее список значений, содержит определенное значение.

теперь класс конфигурации выглядит примерно так:

@ConditionalOnExpression("#{'${conditions.values.options}'.contains('ScenarioOne')}")
ConfigurationForScenarioOne{

  @Bean
  public StudentBean getStudentBean(){
  ...
  }
}

В файле свойств у меня будет что-то вроде этого:

conditions.values.options=${CONDITIONS_VALUES_OPTIONS}

Затем укажите значение CONDITIONS_VALUES_OPTIONS во время выполнения вот так:

-DCONDITIONS_VALUES_OPTIONS=ScenarioOne,ScenarioTwo,ScenarioFive

Причина, по которой я хочу это сделать, заключается в том, чтобы иметь возможность развертывать приложение и использовать разные bean-компоненты в зависимости от значения, указанного во время выполнения.

I будет иметь несколько из этих классов конфигурации, которые будут созданы в зависимости от того, какие из этих свойств переданы. Чтобы добиться этого, я пытался опираться на язык Spring Expression для выполнения следующих действий: 1-Считать свойство conditions.values.options, затем преобразовать его в список, а затем проверить, содержит ли список нужную строку конфигурации.

До сих пор я пробовал несколько выражений, включая:

@ConditionalOnExpression("#{'${conditions.values.options}'.contains('ScenarioOne')}")

и другие подобные выражения, но безуспешно. Может ли кто-нибудь помочь мне увидеть, чего мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Мне удалось получить желаемое поведение, используя это:

@ConditionalOnExpression("#{T(java.util.Arrays).asList('${conditions.values.options}').contains('ScenarioOne')}")

Итак, рассекаем это немного в надежде помочь другим, кто может столкнуться с подобными проблемами: Кажется, что Spring читает свойства через запятую как массив, это фиктивно, потому что с помощью весенней загрузки можно сделать следующее:

Допустимы следующие два оператора:

@Value("${property.with.comma.separated.values}")
private List<String> prop;

ИЛИ

@Value("${property.with.comma.separated.values}")
private String [] prop;

сейчас выражение:

"#{'${conditions.values.options}'.contains('ScenarioOne')}"

выдаст ошибку, говорящую о том, что класс Array не содержит метод с именем '.contains ()', поэтому мне пришлось прибегнуть к выполнению какого-либо метода:

T(java.util.Arrays).asList('${conditions.values.options}')

чтобы прочитать значения, разделенные запятыми, преобразовать массив String в список, а затем выполнить вызов метода .contains (..).

I sh было проще способ сделать это, вызвать вызов метода там, кажется, излишним.

Я открыт для предложений ?

0 голосов
/ 06 апреля 2020

Можете ли вы попробовать написать свои значения аннотаций, как это, и отметьте:

@ConditionalOnExpression("#{${conditions.values.options}}.contains('ScenarioOne')")

Напишите метод содержимого после фигурных скобок.

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