#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 будет использовать пустую строку.