我将Spring启动服务部署到AWS,而application.properties引用了一个OS环境变量,该变量被设置为部署过程的一部分。看起来Spring Boot在启动时无法解析OS环境变量。
如果我回显变量,它似乎设置正确 -
ubuntu@ip-10-227-74-206:~$ echo $EC2_INSTANCE_ID
i-de8c136d
application.properties文件引用该变量,如下所示 -
service.hostId=aws-${EC2_INSTANCE_ID}
启动应用程序时我看到以下错误 -
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.foo.services.registration.config; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'EC2_INSTANCE_ID' in string value "${EC2_INSTANCE_ID}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
知道我可能做错了吗?在application.properties文件中引用时,是否需要添加任何前缀,如“sys:”?
答案 0 :(得分:2)
花了很多时间后,感觉就像在spring-boot中使用init脚本。我发现一些解决方法并不理想,但事情已经完成 -
init conf文件中的源环境变量。
source / etc / environment
这使得环境变量能够启动Spring启动应用程序的父进程。现在将所有环境变量作为JAVA_OPTS传递到conf文件
中JAVA_OPTS =" -Denv.variable = $ {var.foo}"
答案 1 :(得分:0)
使用@ConfigurationProperties
和@Value
注释在bean中注入OS var。
参考:Spring Boot documentation about Externalized Configuration