Конвейер ответов не смог преобразовать класс данных с помощью gson – Ktor

Я действительно извиняюсь, если этот вопрос задавался раньше, я удалю его, как только кто-то опубликует дубликат, но почему это не удается?

package com.example

import com.example.data.TestObject
import io.ktor.application.*
import io.ktor.response.*
import io.ktor.request.*
import io.ktor.client.*
import io.ktor.client.engine.apache.*
import io.ktor.features.CallLogging
import io.ktor.features.Compression
import io.ktor.features.ContentNegotiation
import io.ktor.features.DefaultHeaders
import io.ktor.gson.gson
import io.ktor.http.ContentType
import io.ktor.routing.get
import io.ktor.routing.routing
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import java.text.DateFormat

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
    install(DefaultHeaders)
    install(Compression)
    install(CallLogging)
    install(ContentNegotiation) {
        gson {
            setDateFormat(DateFormat.LONG)
            setPrettyPrinting()
        }
    }

    val server = embeddedServer(Netty, port = 8080) {
        routing {
            get("/test") {
                val instance = TestObject()
                call.respond(instance)
            }
        }
    }
    server.start(true)
}

мой тестовый объект:

data class TestObject(val name: String = "John", val additional: String = "Doe")

и мой build.gradle:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

group 'com.example'
version '0.0.1'
mainClassName = "io.ktor.server.netty.EngineMain"

sourceSets {
    main.kotlin.srcDirs = main.java.srcDirs = ['src']
    test.kotlin.srcDirs = test.java.srcDirs = ['test']
    main.resources.srcDirs = ['resources']
    test.resources.srcDirs = ['testresources']
}

repositories {
    mavenLocal()
    jcenter()
    maven { url 'https://kotlin.bintray.com/ktor' }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "io.ktor:ktor-server-netty:$ktor_version"
    implementation "ch.qos.logback:logback-classic:$logback_version"
    implementation "io.ktor:ktor-client-core:$ktor_version"
    implementation "io.ktor:ktor-client-core-jvm:$ktor_version"
    implementation "io.ktor:ktor-client-apache:$ktor_version"
    implementation "io.ktor:ktor-gson:$ktor_version"
    testImplementation "io.ktor:ktor-server-tests:$ktor_version"
}

Единственное исключение, которое я получаю, это:

java.lang.IllegalArgumentException: Response pipeline couldn't transform 'class com.example.data.TestObject' to the OutgoingContent
    at io.ktor.server.engine.BaseApplicationResponse$Companion$setupSendPipeline$1.invokeSuspend(BaseApplicationResponse.kt:271)
    at io.ktor.server.engine.BaseApplicationResponse$Companion$setupSendPipeline$1.invoke(BaseApplicationResponse.kt)
    at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:268)
    at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67)
    at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:141)
    at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:161)
    at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:27)
    at com.example.ApplicationKt$module$server$1$1$1.invokeSuspend(Application.kt:48)
    at com.example.ApplicationKt$module$server$1$1$1.invoke(Application.kt)
    at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:268)
    at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:67)
    at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:141)
    at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:161)
    at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:27)
    at io.ktor.routing.Routing.executeResult(Routing.kt:147)
    at io.ktor.routing.Routing.interceptor(Routing.kt:34)
    at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:99)
    at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt)

Проект работает, и я могу получить доступ к разным маршрутам разных запросов на получение, но использование Gson для сериализации моих ответов просто не работает?

Любая помощь очень ценится, я начал несколько часов назад :)


person a_local_nobody    schedule 11.08.2019    source источник
comment
У меня такое ощущение, что ваши модули настроены правильно, и ktor, вероятно, не знает, что вы настроили gson для согласования содержимого. Попробуйте указать в файле application.conf.   -  person dhaliman    schedule 14.06.2021
comment
Кроме того, не имеет смысла использовать как embeddedServer, так и EngineMain. Используйте любой из них, но не оба. Избавьтесь от встроенного сервера в модуле и укажите модуль в свойстве modules в вашем application.conf. Тогда все должно работать.   -  person dhaliman    schedule 14.06.2021
comment
@dhaliman В какой-то момент у меня был здесь ответ, но люди проголосовали за него либо из-за того, что он неверен, либо, возможно, назло, я не уверен :), когда я удалил встроенный сервер, он начал работать. не стесняйтесь писать это как ответ   -  person a_local_nobody    schedule 15.06.2021