Spring Boot SpEL и привязка свойств конфигурации к постоянным выражениям - PullRequest
0 голосов
/ 27 августа 2018

Используя Sprint Boot 2.0.4.RELEASE , у меня есть следующий класс свойств (упрощенный):

@Configuration
@EnableConfigurationProperties(MyOtherHierarchicalNonConstantProperties.class)
public class AppConfiguration {
    public static final String MY_CONSTANT = "${path.to.my-constant}";
}

и application.yml (также упрощенный):

path.to.my-constant: mystring

Проблема

Значение из application.yml никогда не присваивается MY_CONSTANT, что необходимо для использования в качестве аргумента для аннотаций.(Я хочу, чтобы все настраиваемые параметры между средами сборки устанавливались в application.yml!). Значение MY_CONSTANT в итоге становится ${path.to.my-constant}.

Я почти весь день работал над этой проблемой., также пробовал несколько различных вариантов после большого количества поиска, таких как:

  • ${${path.to.my-constant}} # 1
  • #{${path.to.my-constant}} # 2
  • ${#{path.to.my-constant}}
  • #{'${path.to.my-constant}'}
  • и многое, многое другое ...

Дополнительная (возможно, полезная) информация

В некоторых случаях я получаю точное выражение какзначение строки (как сказано выше), но в некоторых случаях я получаю исключения, такие как:

  • # 1: IllegalArgumentException из PropertyPlaceholderHelper.parseStringValue, говоря Could not resolve placeholder 'mystring' in value "${${path.to.my-constant}}"
  • # 2: SpelEvaluationException из PropertyOrFieldReference.readProperty с высказыванием EL1008E: Property or field 'mystring' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?

Оба указывают на то, что если исходное выражение будет дополнительно заключено в другие скобки SpEL, внутреннее выражение преобразуется в требуемое значение.Но после этого он отказывается извлекаться из внешних фигурных скобок.(В течение довольно долгого времени я пытался сотнями операций SpEL попытаться и каким-то образом «извлечь» значение из внешних фигурных скобок ...)

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

Plea

Мне известен вопрос о назначении свойств конфигурации для констант в Spring Bootменя много спрашивали, я также попробовал каждый вариант на планете Земля после того, как пришел сюда, чтобы спросить об этом, и я безнадежно потерян.

Кто-то, пожалуйста, раз и навсегда,положить конец этому жалкому отсутствию единого источника правды о настраиваемых константных выражениях и рассказать нам, как сделать это правильно! (И если Spring Boot никогда не предполагал, что это будет возможно, эта информация также может быть полезна длязнаю ...)

PS!Никаких неприятных хаков, пожалуйста ...

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Я думаю, для вас это самый лучший вариант:

@Configuration
@EnableConfigurationProperties(prefix = "path.to")
public class AppConfiguration {
    public final String MY_CONSTANT;

    public UserService(@Value("${path.to.MY_CONSTANT}") String MY_CONSTANT) {
        this.MY_CONSTANT= MY_CONSTANT;
    }
}

Можете ли вы попробовать это и дайте мне знать ..

0 голосов
/ 27 августа 2018

@ anddero ... это тебе поможет ...

@Configuration
@EnableConfigurationProperties(MyOtherHierarchicalNonConstantProperties.class)
public class AppConfiguration {
    public static final String MY_CONSTANT = "${path.to.my-constant}";

@Autowired
    public AppConfiguration (@Value("${path.to.my-constant}") String MY_CONSTANT ) {
        this.MY_CONSTANT = MY_CONSTANT ;
    }
}
...