@Inject在Quarkus + Vertx + Kotlin上不起作用

时间:2019-11-23 10:59:15

标签: kotlin vert.x quarkus

我正在尝试使用Quarkus和Kotlin和一个Vertx编写一个简单的响应式应用程序。但是这段简单的代码不起作用:

package com.acme

import io.quarkus.vertx.web.Route
import io.vertx.core.Vertx
import io.vertx.core.http.HttpMethod
import io.vertx.ext.web.RoutingContext
import javax.enterprise.context.ApplicationScoped
import javax.inject.Inject

@ApplicationScoped
open class Routing {

    @Inject
    lateinit var vertx: Vertx

    @Route(path = "/hello", methods = [HttpMethod.GET])
    fun handle(rc: RoutingContext) {
        println(vertx)
        rc.response().end("hello")
    }
}

我收到此异常:

kotlin.UninitializedPropertyAccessException: lateinit property vertx has not been initialized
        at com.acme.Routing.handle(Routing.kt:18)

我已经阅读了有关Kotlin的Quarkus文档(它仍然是一种预览技术),并说了一些有关使用'@field:xxx'的内容,但是我已经尝试了很多方法,但都无济于事。如果有人知道答案,将不胜感激。

我已经在Java中尝试了同样的方法,并且效果很好。 @Inject Vertx或@Inject EventBus,但在Kotlin中似乎是不可能的

2 个答案:

答案 0 :(得分:1)

我参加了您的示例课程,它运行正常:https://github.com/dankito/QuarkusKotlinInjetStackoverflowQuestion

(只需在项目文件夹中执行./gradlew quarkusDev。)

您是否与Quarkus项目创建者https://code.quarkus.io/一起设置了项目?

在此处检查“ Eclipse Vert.x”,“ Eclipse Vert.x-Web”和“ Kotlin”(添加底部)。

然后,您应该对类路径具有以下依赖关系(Gradle表示法): -org.jetbrains.kotlin:kotlin-stdlib-jdk8 -io.quarkus:quarkus-kotlin -io.quarkus:quarkus-vertx -io.quarkus:quarkus-vertx-web

答案 1 :(得分:1)

根据https://quarkus.io/guides/kotlin#cdi-inject-with-kotlin,应添加@field: Default“以处理Kotlin反射批注定义中缺少@Target的情况”:

    @Inject
    @field: Default
    lateinit var vertx: Vertx