koin: Since koin for ktor 3.5.0 install(Koin) doesnt work. Using startKoin works

I upgraded from koin 3.4.0 to 3.5.1 for Ktor and since then I get the error:

Exception in thread “DefaultDispatcher-worker-8” java.lang.IllegalStateException: KoinApplication has not been started at org.koin.core.context.GlobalContext.get(GlobalContext.kt:36) at org.koin.core.component.KoinComponent$DefaultImpls.getKoin(KoinComponent.kt:33) at com.noovelia.nooveliabeats.core.hostedservices.GrpcServer.getKoin(GrpcServer.kt:16) at com.noovelia.nooveliabeats.core.hostedservices.GrpcServer$special$$inlined$inject$default$1.invoke(KoinComponent.kt:68) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at com.noovelia.nooveliabeats.core.hostedservices.GrpcServer.getLoggingService(GrpcServer.kt:30) at com.noovelia.nooveliabeats.core.hostedservices.GrpcServer.access$getLoggingService(GrpcServer.kt:16) at com.noovelia.nooveliabeats.core.hostedservices.GrpcServer$run$1.invokeSuspend(GrpcServer.kt:35) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)

Instead of using: install(Koin), I tried with startKoin and it seems to work.

Koin module and version: [e.g]: koin-ktor:3.5.1

About this issue

  • Original URL
  • State: closed
  • Created 9 months ago
  • Reactions: 4
  • Comments: 19 (5 by maintainers)

Commits related to this issue

Most upvoted comments

I reverted back the startKoin in the main Ktor plugin. I will publish a RC build to let you test 👍

Just a note that I’m running into the same issue.

Also when moving from io.insert-koin:koin-ktor.3.4.3 to 3.5.0 tests like the following start to fail:

`@TestInstance(TestInstance.Lifecycle.PER_CLASS) class DokumentRestControllerTest : KoinTest {

@JvmField
@RegisterExtension
@Suppress("unused")
val koinTestExtension = KoinTestExtension.create {
    modules(
        restKoinModule,
        memoryPersistenceKoinTestModule,
    )
}

@Test
fun testGetDokumentUnknown() = testApplication {
    application {
        dokumentModule()
    }        // call with unknown id should result in 404
    client.get("/aktenordner/dokument/e58ed763-928c-4155-bee9-fdbaaadc15ff").apply {
        assertEquals(HttpStatusCode.NotFound, status)
    }
}

`

This works with 3.4.3, but with 3.5.0 I get java.lang.IllegalStateException: No instance for key AttributeKey: KOIN at io.ktor.util.Attributes$DefaultImpls.get(Attributes.kt:62) at io.ktor.util.AttributesJvmBase.get(AttributesJvm.kt:15) at org.koin.ktor.ext.ApplicationExtKt.getKoin(ApplicationExt.kt:34) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt$dokumentModule$$inlined$inject$default$1.invoke(ApplicationExt.kt:78) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt.dokumentModule$lambda$0(DokumentRestController.kt:29) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt.access$dokumentModule$lambda$0(DokumentRestController.kt:1) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt$dokumentModule$2$1$3.invokeSuspend(DokumentRestController.kt:43) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt$dokumentModule$2$1$3.invoke(DokumentRestController.kt) at org.codeshards.aktenordner.adapter.incoming.rest.DokumentRestControllerKt$dokumentModule$2$1$3.invoke(DokumentRestController.kt) at io.ktor.server.routing.Route$buildPipeline$1$1.invokeSuspend(Route.kt:116) at io.ktor.server.routing.Route$buildPipeline$1$1.invoke(Route.kt) at io.ktor.server.routing.Route$buildPipeline$1$1.invoke(Route.kt) at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:80) at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57) at io.ktor.util.pipeline.DebugPipelineContext.execute$ktor_utils(DebugPipelineContext.kt:63) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77) at io.ktor.server.routing.Routing$executeResult$$inlined$execute$1.invokeSuspend(Pipeline.kt:478) at io.ktor.server.routing.Routing$executeResult$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.server.routing.Routing$executeResult$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.util.debug.ContextUtilsKt.initContextInDebugMode(ContextUtils.kt:17) at io.ktor.server.routing.Routing.executeResult(Routing.kt:190) at io.ktor.server.routing.Routing.interceptor(Routing.kt:64) at io.ktor.server.routing.Routing$Plugin$install$1.invokeSuspend(Routing.kt:140) at io.ktor.server.routing.Routing$Plugin$install$1.invoke(Routing.kt) at io.ktor.server.routing.Routing$Plugin$install$1.invoke(Routing.kt) at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:80) at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57) at io.ktor.server.engine.BaseApplicationEngineKt$installDefaultTransformationChecker$1.invokeSuspend(BaseApplicationEngine.kt:124) at io.ktor.server.engine.BaseApplicationEngineKt$installDefaultTransformationChecker$1.invoke(BaseApplicationEngine.kt) at io.ktor.server.engine.BaseApplicationEngineKt$installDefaultTransformationChecker$1.invoke(BaseApplicationEngine.kt) at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:80) at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57) at io.ktor.util.pipeline.DebugPipelineContext.execute$ktor_utils(DebugPipelineContext.kt:63) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77) at io.ktor.server.testing.TestApplicationEngine$3$invokeSuspend$$inlined$execute$1.invokeSuspend(Pipeline.kt:478) at io.ktor.server.testing.TestApplicationEngine$3$invokeSuspend$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.server.testing.TestApplicationEngine$3$invokeSuspend$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.util.debug.ContextUtilsKt.initContextInDebugMode(ContextUtils.kt:17) at io.ktor.server.testing.TestApplicationEngine$3.invokeSuspend(TestApplicationEngine.kt:310) at io.ktor.server.testing.TestApplicationEngine$3.invoke(TestApplicationEngine.kt) at io.ktor.server.testing.TestApplicationEngine$3.invoke(TestApplicationEngine.kt) at io.ktor.server.testing.TestApplicationEngine$2.invokeSuspend(TestApplicationEngine.kt:90) at io.ktor.server.testing.TestApplicationEngine$2.invoke(TestApplicationEngine.kt) at io.ktor.server.testing.TestApplicationEngine$2.invoke(TestApplicationEngine.kt) at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:80) at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57) at io.ktor.util.pipeline.DebugPipelineContext.execute$ktor_utils(DebugPipelineContext.kt:63) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2$invokeSuspend$$inlined$execute$1.invokeSuspend(Pipeline.kt:478) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2$invokeSuspend$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2$invokeSuspend$$inlined$execute$1.invoke(Pipeline.kt) at io.ktor.util.debug.ContextUtilsKt.initContextInDebugMode(ContextUtils.kt:17) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2.invokeSuspend(TestApplicationEngine.kt:309) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2.invoke(TestApplicationEngine.kt) at io.ktor.server.testing.TestApplicationEngine$handleRequestNonBlocking$2.invoke(TestApplicationEngine.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78) at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167) at kotlinx.coroutines.BuildersKt.withContext(Unknown Source) at io.ktor.server.testing.TestApplicationEngine.handleRequestNonBlocking$ktor_server_test_host(TestApplicationEngine.kt:224) at io.ktor.server.testing.TestApplicationEngine.handleRequestNonBlocking$ktor_server_test_host$default(TestApplicationEngine.kt:211) at io.ktor.server.testing.client.TestHttpClientEngine.runRequest(TestHttpClientEngine.kt:70) at io.ktor.server.testing.client.TestHttpClientEngine.execute(TestHttpClientEngine.kt:55) at io.ktor.server.testing.client.DelegatingTestClientEngine.execute(DelegatingTestClientEngine.kt:55) at io.ktor.client.engine.HttpClientEngine$executeWithinCallContext$2.invokeSuspend(HttpClientEngine.kt:99) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)