Чтение переменных среды MacOs в Spring Boot - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь установить некоторые учетные данные API в файле свойств загрузки Spring "application.property", используя переменные среды. Мои переменные окружения выглядят так:

export ACCOUNT_SID ="some value"
export AUTH_TOKEN="some value"

Теперь, когда я запускаю команду echo, я получаю «некоторое значение» для каждой переменной, и даже когда я запускаю System.getenv («ACCOUNT_SID») в обычном java приложение. Однако, когда я устанавливаю значения в файле свойств, все, что я получаю, это строки "$ {ACCOUNT_SID}" и "$ {AUTH_TOKEN}", вставленные в мои поля POJO. то есть предположим следующую конфигурацию в моем файле application.property:

twilio.account_sid=${ACCOUNT_SID}
twilio.auth_token=${AUTH_TOKEN}

Где ACCOUNT_SID и AUTH_TOKEN - мои переменные среды. Затем я устанавливаю свой POJO следующим образом:

@Configuration
@ConfigurationProperties(prefix="twilio")
public class TwilioConfig {
    private String accountSid;
    private String authToken;

    geters/setters
}

Когда я запускаю это и пытаюсь напечатать значения полей, я получаю $ {ACCOUNT_SID} и $ {AUTH_TOKEN}, напечатанные в консоли. Основной файл java выглядит так:

@SpringBootApplication
public class SmshotlineApplication implements CommandLineRunner {
    @Autowired
    private TwilioConfig twilio;

    @Override
    public void run(String... args) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("ACCOUNT_SID="+twilio.getAccountSid());
        System.out.println("ACCOUNT_SID="+twilio.getAuthToken());
    }

    public static void main(String[] args) {
        SpringApplication.run(SmshotlineApplication.class, args);
    }
}

enter image description here

Я даже пытаюсь ввести значение, используя аннотацию @Value для переменных. Когда я тестировал с использованием переменной среды JAVA_HOME, я фактически должен был напечатать путь, но когда я попытался сделать то же самое с моими определенными переменными среды, программа потерпела крах, потому что значения не могли быть найдены. Поэтому я должен был указать значение по умолчанию, которое будет напечатано. пример ниже.

@SpringBootApplication
public class SmshotlineApplication implements CommandLineRunner {

    @Value("${java.home}")
    String javaHome;
    @Value("${account.sid:DEFAULT}")
    String ACCOUNT_SID;
    @Value("${auth.token:DEFAULT}")
    String AUTH_TOKEN;

    @Override
    public void run(String... args) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("ACCOUNT_SID="+ACCOUNT_SID);
        System.out.println("ACCOUNT_SID="+AUTH_TOKEN);
        System.out.println("JAVA_HOME="+javaHome);
    }


    public static void main(String[] args) {
        SpringApplication.run(SmshotlineApplication.class, args);
    }
}

enter image description here

Пожалуйста, помогите мне понять или понять, что я делаю неправильно. Если переменные не видны программой, это заставляет меня думать, что я неправильно устанавливаю переменные среды. Но в то же время это сбивает меня с толку, потому что когда я использую System.getenv () в обычной (не с пружинной загрузкой Java) программе, я получаю для печати значения! Я использую Ma c OS Catalina, и мой env var хранится в моем профиле ~ / .profile.

1 Ответ

0 голосов
/ 19 января 2020

Во-первых, вы не должны вызывать свойства класса SpringBootApplication, но вы должны использовать @Value из другого вида контекста. Кроме того, для чтения ваших конфигов свойств из application.properties с помощью @Value вам нужно вызвать свойство с тем же именем, я проверил ваш код, но вы не называете то же имя свойства, например:

application.properties

twilio.account_sid=${ACCOUNT_SID}
twilio.auth_token=${AUTH_TOKEN}

SmsHotLineApplication class

@Value("${twilio.account_sid:DEFAULT}")
String ACCOUNT_SID;
@Value("${twilio.auth_token:DEFAULT}")
String AUTH_TOKEN;

Тогда должно работать, если вы хотите использовать @ConfigurationProperties(prefix="twilio") Тогда вы должны вызывать то же самое, как вы назвали свои свойства, например :

application.properties

twilio.accountSid=${ACCOUNT_SID}
twilio.authToken=${AUTH_TOKEN}

Класс TwilioConfig

@Configuration
@ConfigurationProperties(prefix="twilio")
public class TwilioConfig {
    private String accountSid;
    private String authToken;

    geters/setters
}
...