Проблема в переопределении конфигурации с переменными env в dropwizard

#java #environment-variables #dropwizard

#java #переменные среды #dropwizard

Вопрос:

MyWebConfiguration.java имеет следующий код, как описано в drop wizard

 public void initialize(Bootstrap<MyWebConfiguration> bootstrap) {
    LOG.info("Initializing configuration");
    // Enable variable substitution with environment variables
    bootstrap.setConfigurationSourceProvider(
       new SubstitutingSourceProvider(
           bootstrap.getConfigurationSourceProvider(),
             new EnvironmentVariableSubstitutor(false)
       )
   );
}
  

dev-сервисы.файл yaml имеет

 tokenSecret: ${TOKEN_SECRET}
  

но когда я запускаю приложение и выполняю отладку, чтобы проверить, какое значение я получаю для tokenSecret, оно показывает мне tokenSecret = «${TOKEN_SECRET}» в консоли отладки.

Я попытался изменить MyWebConfiguration.java следующим образом:-

 bootstrap.setConfigurationSourceProvider(
       new SubstitutingSourceProvider(
           bootstrap.getConfigurationSourceProvider(),
             new EnvironmentVariableSubstitutor(true)// changed false to true
       )
   );
  

Но теперь, когда я пытаюсь запустить программу, она показывает мне следующую ошибку

 Exception in thread "main" io.dropwizard.configuration.UndefinedEnvironmentVariableException: The environment variable 'TOKEN_SECRET' is not defined; could not substitute the expression '${TOKEN_SECRET}'.
    at io.dropwizard.configuration.EnvironmentVariableLookup.lookup(EnvironmentVariableLookup.java:41)
    at org.apache.commons.lang3.text.StrSubstitutor.resolveVariable(StrSubstitutor.java:726)
    at org.apache.commons.lang3.text.StrSubstitutor.substitute(StrSubstitutor.java:649)
    at org.apache.commons.lang3.text.StrSubstitutor.substitute(StrSubstitutor.java:563)
    at org.apache.commons.lang3.text.StrSubstitutor.replace(StrSubstitutor.java:305)
    at io.dropwizard.configuration.SubstitutingSourceProvider.open(SubstitutingSourceProvider.java:39)
    at io.dropwizard.configuration.YamlConfigurationFactory.build(YamlConfigurationFactory.java:80)
    at io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:124)
    at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:72)
    at io.dropwizard.cli.Cli.run(Cli.java:75)
    at io.dropwizard.Application.run(Application.java:79)
  

Кто-нибудь может сказать мне, где я мог ошибиться?

Комментарии:

1. Где вы устанавливаете фактическую переменную env. В вашем классе напишите main и выполните: System.out.println(System.getenv(«TOKEN_SECRET»)); и посмотрите, не является ли результат null . Вы работаете в eclipse?

2. да, я запускаю его в eclipse. Если я запускаю его через терминал, он работает.

3. Ваша среда eclipse не знает о ваших переменных env. Вам нужно зайти в свою конфигурацию запуска и установить там переменные

4. хорошо, спасибо. Сработало для меня.

5. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что проблема заключалась в чем-то совершенно ином, чем то, что предлагает заголовок и вопрос — распространение переменных среды из IDE, а не из системы. В основном это «почему этот код не работает?».

Ответ №1:

Ваши переменные среды не распространяются. Автоматическое распространение из вашей системы в среду IDE, из которой вы запускали DropWizard, отсутствует.

Во-вторых, при использовании new EnvironmentVariableSubstitutor(false) (нестрогом) вам необходимо указать значения по умолчанию, даже если они должны быть пустыми:

 tokenSecret: ${TOKEN_SECRET:-}
  

При отсутствии strict будет выбрасываться UndefinedEnvironmentVariableException , а non-strict будет использовать пустую строку.