如何在专用 Kotlin 中读取 Quarkus Config Class

How to read Quarkus Config in dedicated Kotlin Class

读取 Kotlin/Quarkus 中的应用程序属性在测试中有效 class 喜欢这个正确(打印将写入 application.properties 文件中定义的值):

@QuarkusTest
class Test {

    @ConfigProperty(name = "test.env")
    val testEnv: String? = null

    @Test
    fun test(){
        println(testEnv)
    }
}

但是当我创建专用配置 class 并尝试从该 class 访问成员时,该值始终为 null(并且与 application.properties 中定义的不同):

class Config{
    
    @ConfigProperty(name = "test.env")
    val foo: String? = null
}

试图在测试中访问此值class(但该值始终为空):

@QuarkusTest
class Test {

    @Test
    fun test(){
        println(Config().foo)
    }
}

Quarkus 版本:1.10.3.Final

我做错了什么?

@ConfigProperty 注释实际上是一个 CDI 限定符。在 Quarkus 中,如果一个字段用限定符注释,则不必注释它 @Inject -- 但它被视为好像是。

所以你的测试 class 等同于:

@QuarkusTest
class Test {
    @Inject
    @ConfigProperty(name = "test.env")
    val testEnv: String? = null

    @Test
    fun test(){
        println(testEnv)
    }
}

现在,另一件重要的事情是,如果可能的话,Quarkus 测试框架将测试 class 视为 CDI bean。也就是说,测试class是由CDI容器实例化的,它执行依赖注入。这就是 testEnv 的填充方式。

你如何实现同样的目标?

  1. 通过添加 bean 定义注释.
  2. 使您的 class 成为一个 bean
@Singleton
class Config{ 
    @ConfigProperty(name = "test.env")
    val foo: String? = null
}

(请注意,在标准 CDI 中,@Singleton 不是 bean 定义注释。在 Quarkus 中,@Singleton 一个 bean 定义注释,但是如果如果你想严格遵守标准,你可以使用@ApplicationScoped代替。)

  1. 不要通过调用构造函数实例化 Config。相反,再次使用依赖注入:
@QuarkusTest
class Test {
    @Inject
    Config config;

    @Test
    fun test(){
        println(config.foo)
    }
}