我正在尝试使用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中似乎是不可能的
答案 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