【问题标题】:How to get OS environment variable from Spring Boot?如何从 Spring Boot 获取操作系统环境变量?
【发布时间】:2018-07-10 10:23:33
【问题描述】:

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

@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);
 }
}

导出 COMPONENT_PARAM_CORS=**

打印环境

说它存在,但是当我尝试 mvn clean install 时:发生错误

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)

【问题讨论】:

    标签: java spring environment-variables


    【解决方案1】:

    您可以使用System.getenv(<environment name>) 方法来检索环境变量值。喜欢:

    registry.addMapping("/" + System.getenv("COMPONENT_PARAM_CORS"));
    

    或使用默认值:

    registry.addMapping("/" + System.getenv().getOrDefault("COMPONENT_PARAM_CORS", "DEFAULT_VALUE"))
    

    更多信息在这里https://docs.oracle.com/javase/tutorial/essential/environment/env.html

    如果你真的想注入变量值,你可以修改你的代码如下:

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

    【讨论】:

    • 我知道System.getenv(),但是在编译应用程序时它可以工作,但是我在运行应用程序时需要接收参数,或者@value也预编译?
    • System.getenv()@Value 中的 SPEL 表达式都将在运行时执行,而不是在编译时执行,因此这两个选项都应该适合您。
    • 我可以使用默认值,例如:
    • 对于默认值,您可以使用无参数的System.getenv() 调用,它会为您提供Map<String, String>。然后调用getOrDefault(key, defaultValue) 方法(java 1.8+)。对于 SPEL 选项,只需使用 elvis 运算符:?:。我已经调整了我的答案以显示这一点。
    【解决方案2】:

    你应该使用System.getenv(),例如:

    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));
            }
        }
    }
    

    请参考This documentationthis question

    【讨论】:

      【解决方案3】:
      @Configuration
      @EnableWebMvc
      public class CorsConfig implements WebMvcConfigurer {
      
       @Value("#{systemEnvironment['COMPONENT_PARAM_CORS']?:'**'}")
       private String COMPONENT_PARAM_CORS;
      
       @Override
       public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/"+COMPONENT_PARAM_CORS);
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2019-08-03
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        相关资源
        最近更新 更多