Java 如何在Quarkus中读取环境变量

Java 如何在Quarkus中读取环境变量,java,cdi,quarkus,Java,Cdi,Quarkus,我正在尝试使用@ConfigProperty读取Quarkus应用程序中的环境变量,但未成功执行此操作。我认为仅仅指定变量名就足够了,但它不起作用: @ConfigProperty(name = "MY_ENV_VAR") String envVar; 我还尝试在application.properties中指定属性 my.var=${MY_ENV_VAR:defaultValue} 读起来就像 @ConfigProperty(name = "my.var") String myVar;

我正在尝试使用
@ConfigProperty
读取Quarkus应用程序中的环境变量,但未成功执行此操作。我认为仅仅指定变量名就足够了,但它不起作用:

@ConfigProperty(name = "MY_ENV_VAR")
String envVar;
我还尝试在application.properties中指定属性

my.var=${MY_ENV_VAR:defaultValue}
读起来就像

@ConfigProperty(name = "my.var")
String myVar;
但是变量总是空的

我错过什么了吗?在Quarkus中读取环境变量的正确方法是什么?

我正在使用Quarkus 1.2.0。Final

我和我的同事已经找到了问题的根源。我试图读取构造函数中用
@ConfigProperty
注释的字段,但是只有在调用构造函数后才注入属性

我提供了一个工作示例:

package org.acme.config;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class EnvGreetingService {

    private final String varA;

    @ConfigProperty(name = "ENV_VAR_B")
    String varB;

    public EnvGreetingService(@ConfigProperty(name = "ENV_VAR_A") String varA) {
        System.out.println("constructor varA=" + varA);
        System.out.println("constructor varB=" + varB);
        this.varA = varA;
    }

    public void greetWithEnvVar() {
        System.out.println("method varA=" + varA);
        System.out.println("method varB=" + varB);
    }
}
注意:
application.properties中不需要映射环境变量

控制台输出将是:

constructor varA=a
constructor varB=null
method varA=a
method varB=b

因此,如果您想在构造函数中使用应用程序属性或环境变量,应该将其注入构造函数参数。

您所拥有的是正确的。你能给全班同学看吗?在CDIBean注入的情况下,它必须是CDIBean,例如
@ApplicationScoped
。最好在void&no-params方法上使用@Inject。此方法将在bean在CDI生命周期中处于活动状态后调用,以便它能够理解和读取带注释的字段变量。在你的例子中不推荐构造函数。我喜欢字段注入,一旦你有太多的字段,构造函数注入就会造成巨大的混乱