Kotlin 克托尔扔了一个;迷失在模棱两可的关系中”;获取请求时出错

Kotlin 克托尔扔了一个;迷失在模棱两可的关系中”;获取请求时出错,kotlin,ktor,Kotlin,Ktor,我有一个在Kotlin 1.4.0和Ktor 1.3.2上运行的项目,所以我决定尝试将我的版本升级到Kotlin 1.4.30和Ktor 1.5.1(因为我也升级到Java 11,因为OpenJDK8没有JavaFx) 当我最终修复了导入问题和诸如此类的问题并运行我的Web服务器时,第一个页面正确打开(它映射到route/),但其他GET请求在RoutingSolve类上抛出了一个“迷失在模糊中”错误。显然,在比较已注册选择器的质量时,“/ping”选择器的值与“/”选择器的值相同,因此抛出错误

我有一个在Kotlin 1.4.0和Ktor 1.3.2上运行的项目,所以我决定尝试将我的版本升级到Kotlin 1.4.30和Ktor 1.5.1(因为我也升级到Java 11,因为OpenJDK8没有JavaFx)

当我最终修复了导入问题和诸如此类的问题并运行我的Web服务器时,第一个页面正确打开(它映射到route/),但其他GET请求在RoutingSolve类上抛出了一个“迷失在模糊中”错误。显然,在比较已注册选择器的质量时,“/ping”选择器的值与“/”选择器的值相同,因此抛出错误。我已经在Ktor 1.5.1和1.5.0中验证了这种行为。版本1.4.x抛出协同路由错误

我的服务器配置声明如下:

fun serverConfiguration(controller: Controller): NettyApplicationEngine {
    SocketRoutes.controller = controller
    WebUIRoutes.controller = controller

    return embeddedServer(Netty, 9090) {
        install(ContentNegotiation) {
            jackson {
                enable(SerializationFeature.INDENT_OUTPUT)
                dateFormat = DateFormat.getDateInstance()
                deactivateDefaultTyping()
            }
        }
        install(FreeMarker) {
            templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates")
            defaultEncoding = Charsets.UTF_8.toString()
        }
        install(CallLogging)
        install(Sessions) {
            cookie<UserPreferences>("preferences")
        }
        getRoutes(this)
    }
}

这些路线本身在WebUIRoutes.kt上

fun getRoutes(pipeline: Application): Routing {
    return Routing.install(pipeline) {
        trace { application.log.trace(it.buildText()) }
        static("/") {
            resources("web-static")
        }
        home()
        getTableBody()
        ping()
    }
}
object WebUIRoutes {
    lateinit var controller: Controller
    fun Route.home() {
        get("/") {
            val session = call.sessions.get<UserPreferences>() ?: UserPreferences()
            call.sessions.set(session)
            val nrPages = calculateNrOfPages(session.nrElements)
            call.response.cookies["nrElements"]?.copy(value = "$nrPages")
            call.respondTemplate(
                "showCodes.ftl", mapOf(
                    "total" to nrPages, "nrElements" to session.nrElements,
                    "validateOnInput" to session.validateOnInput
                )
            )
        }
    }

    (...)

    fun Route.ping() {
        get("/ping") {
            if (controller.ping())
                call.respond(HttpStatusCode.OK)
            else
                call.respond(HttpStatusCode.NotFound)
        }
    }
}
对象WebUIRoutes{
lateinit var控制器:控制器
有趣的路线{
获取(“/”){
val session=call.sessions.get()?:UserPreferences()
call.sessions.set(会话)
val nrPages=计算页面数(session.nElements)
call.response.cookies[“nElements”]?.copy(value=“$nrPages”)
call.respondTemplate(
“showCodes.ftl”,地图(
“总计”至nrPages,“nrElements”至session.nElements,
“validateOnInput”到session.validateOnInput
)
)
}
}
(...)
趣味路线{
获取(“/ping”){
if(controller.ping())
call.respond(HttpStatusCode.OK)
其他的
call.respond(HttpStatusCode.NotFound)
}
}
}

因此,我不知道到底发生了什么,我在网上也没有找到任何关于迁移到Ktor新版本的信息和相关问题…

问题是
resources
函数在
/
路由下添加了一个带有通配符的路由,因此路由会解决它,而不是
/ping
路由。您只需将
静态
函数调用移动到
路由
的末尾,就可以让它按照您的期望工作。

我会尝试,如果可以,我会接受答案!谢谢你的帮助!那么这在最新版本的ktor中发生了变化?“这是在1.3.2上运行的。@Sidner自1.3.2版以来,路由有几处重大更改,其中可能有一处引入了回归。