SpEL @Value с вложенным условием - PullRequest
0 голосов
/ 01 февраля 2020

Я использую аннотацию @Value и хочу, чтобы она стала немного сложнее. У меня есть два значения конфигурации - val1 и val2. Я хочу добавить его следующим образом: Если в конфигурации существует val1, используйте его. Иначе, если val2 - истина, введите default1. Если это неверно, введите default2.

Я пробовал что-то вроде:

@Value("#{val1 ? val1 : (val2 ? 'default1' : 'default2')}")

Но я продолжаю получать:

`EL1008E`: property or filed 'val1' cannot be found on object of type 'org.springframeowrk.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?

Когда Я пробую другие выражения, такие как ${val1} или '${val1}', но они все еще не работают.

Как правильно выполнять вложенные условия в аннотации @Value или это слишком сложно?

1 Ответ

3 голосов
/ 01 февраля 2020

Я скорректировал выражение и написал небольшой тест, чтобы проиллюстрировать это изменение. Короче говоря, используйте ${some.prop:defaultVal} для определения значения по умолчанию и ${some.prop:} для определения пустой строки в качестве значения по умолчанию. Кроме того, используйте одинарные кавычки ' в выражении SPEL для указания значения String вместо ссылки.

Поиграйте с TestPropertySource, чтобы проверить результат. Я добавил второй тест, чтобы показать, что если значение по умолчанию отсутствует, Spring может (не всегда) решить вернуть текстовое представление заполнителя.


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@TestPropertySource(properties = {"val1=v1", "val2=v2"})
public class SomeTest {

    @Value("#{ '${val1:}' != '' ? '${val1}' : ('${val2:}' != '' ? 'default1' : 'default2')}")
    private String testVal;

    @Value("${nonExistingValue}")
    private String nonExistingValue;

    @Test
    public void test() {
        assertThat(testVal).isEqualTo("v1");
    }

    @Test
    public void testNonExistingValue() {
        assertThat(nonExistingValue).isEqualTo("${nonExistingValue}");
    }
}

Хотя приведенное выше выражение работает, я бы Настоятельно рекомендуем использовать ConfigurationProperties или T expression type operator, ссылаясь на метод stati c. Текущая настройка может стать еще менее читаемой, когда выражения станут более сложными.

...