【发布时间】:2020-05-05 11:04:46
【问题描述】:
我正在尝试使用环境变量在 Spring 启动属性文件“application.property”中设置一些 API 凭据。我的环境变量如下所示:
export ACCOUNT_SID ="some value"
export AUTH_TOKEN="some value"
现在,当我运行 echo 命令时,我得到每个变量的“一些值”,甚至当我在常规 java 应用程序中运行 System.getenv("ACCOUNT_SID") 时。但是,当我在属性文件中设置值时,我得到的只是注入我的 POJO 字段的字符串“${ACCOUNT_SID}”和“${AUTH_TOKEN}”。即在我的 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);
}
}
我什至尝试通过在变量上使用@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);
}
}
请帮助我理解或看看我做错了什么。如果程序没有看到变量,让我认为我错误地设置了环境变量。但同时这让我感到困惑,因为当我在常规(不是 Spring Boot Java)程序中使用 System.getenv() 时,我可以打印这些值!我正在使用 Mac OS Catalina,我的环境变量存储在我的配置文件 ~/.profile 中。
【问题讨论】:
-
在你的问题中,你说
API_SID,但也说ACCOUNT_SID。 -
抱歉,这只是示例。它应该是 ACCOUNT_SID。我会尝试编辑它。
-
不要将它们注入
SpringBootApplication类。创建一个不同的,相当确定这在生命周期中还为时过早,无法注入它们。您也错过了TwilioConfig课程的重点。将TwilioConfig作为spring bean 注入并使用getters/setters/ -
感谢您的反馈,我对 Spring 框架和 Spring Boot 非常陌生。
标签: java spring macos spring-boot environment-variables