Java 如何从Spring Boot获取OS环境变量?

Java 如何从Spring Boot获取OS环境变量?,java,spring,environment-variables,Java,Spring,Environment Variables,我是java和spring框架的新手。我的问题是如何将OS(ubuntu)环境变量注入SpringBootbean。我尝试的是: @Configuration @EnableWebMvc public class CorsConfig implements WebMvcConfigurer { @Value("${COMPONENT_PARAM_CORS}") private String COMPONENT_PARAM_CORS; @Override public void addC

我是java和spring框架的新手。我的问题是如何将OS(ubuntu)环境变量注入SpringBootbean。我尝试的是:

@Configuration
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {
 @Value("${COMPONENT_PARAM_CORS}")
 private String COMPONENT_PARAM_CORS;

 @Override
 public void addCorsMappings(CorsRegistry registry) {
  registry.addMapping("/"+COMPONENT_PARAM_CORS);
 }
}
导出组件参数=**

printenv

告诉我它是存在的,但是当我尝试mvn清理安装时:发生了错误

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'corsConfig': Injection of autowired dependencies 
failed; nested exception is java.lang.IllegalArgumentException: Could not 
resolve placeholder 'COMPONENT_PARAM_CORS' in value "${COMPONENT_PARAM_CORS}"
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 
'COMPONENT_PARAM_CORS' in value "${COMPONENT_PARAM_CORS}"
然后我的单元测试也下降了
(我试图搜索此错误,但所有主题都是旧主题,并且使用application.properties中的参数,但我需要使用env var而不是application.properties)

您可以使用
System.getenv()
方法检索环境变量值。比如:

registry.addMapping("/" + System.getenv("COMPONENT_PARAM_CORS"));
或使用默认值:

registry.addMapping("/" + System.getenv().getOrDefault("COMPONENT_PARAM_CORS", "DEFAULT_VALUE"))
更多信息请点击此处

如果您确实希望注入变量值,可以将代码修改为以下内容:

@Value("#{systemEnvironment['COMPONENT_PARAM_CORS'] ?: 'DEFAULT_VALUE'}")
private String COMPONENT_PARAM_CORS;

您可以使用
System.getenv()
方法检索环境变量值。比如:

registry.addMapping("/" + System.getenv("COMPONENT_PARAM_CORS"));
或使用默认值:

registry.addMapping("/" + System.getenv().getOrDefault("COMPONENT_PARAM_CORS", "DEFAULT_VALUE"))
更多信息请点击此处

如果您确实希望注入变量值,可以将代码修改为以下内容:

@Value("#{systemEnvironment['COMPONENT_PARAM_CORS'] ?: 'DEFAULT_VALUE'}")
private String COMPONENT_PARAM_CORS;
您应该使用,例如:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}
import java.util.Map;
公共类环境映射{
公共静态void main(字符串[]args){
Map env=System.getenv();
for(字符串envName:env.keySet()){
System.out.format(“%s=%s%n”,
我的名字,
env.get(envName));
}
}
}
请参阅和。

您应该使用,例如:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}
import java.util.Map;
公共类环境映射{
公共静态void main(字符串[]args){
Map env=System.getenv();
for(字符串envName:env.keySet()){
System.out.format(“%s=%s%n”,
我的名字,
env.get(envName));
}
}
}

请参阅和。

我知道
System.getenv()
,但它在编译应用程序时工作,但我需要在运行应用程序时接收参数,或者
@value
也预编译?
System.getenv()
@value
中的SPEL表达式都将在运行时执行,而不是在编译时执行,因此,这两个选项都应该对您有效。我可以使用默认值,例如:对于默认值,您可以使用无参数
System.getenv()
调用,它为您提供了
Map
。然后调用
getOrDefault(key,defaultValue)
method(Java1.8+)。对于SPEL选项,只需使用elvis运算符:
?:
。我已经调整了我的答案来说明这一点。我知道
System.getenv()
,但它在编译应用程序时起作用,但我在运行应用程序时需要接收参数,或者
@value
也预编译?
System.getenv()
@value
中的SPEL表达式都将在运行时执行,而不是在编译时执行,所以这两个选项都适用于您。我可以使用默认值,比如:对于默认值,您可以使用argumentless
System.getenv()
调用,它将为您提供一个
映射。然后调用
getOrDefault(key,defaultValue)
method(Java1.8+)。对于SPEL选项,只需使用elvis运算符:
?:
。我已经调整了我的答案来说明这一点。