Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Got "Content type application/json is not supported" exception when the class to serialize/unserialize is in the function #811

Closed
scorsi opened this issue Dec 20, 2018 · 2 comments
Assignees
Milestone

Comments

@scorsi
Copy link

scorsi commented Dec 20, 2018

Hello,

I don't know if it is an expected result but here is something that didn't work and how to solve it.
I spent a lot of time to fix that.
Did the same with ktor-gson or ktor-jackson.

Ktor Version

1.0.1

Ktor Engine Used(client or server and name)

ktor-server-netty

JVM Version, Operating System and Relevant Context

jdk1.8.0_17 on macOS Mojave 10.14.1

Feedback

I'm getting

io.ktor.features.UnsupportedMediaTypeException: Content type application/json is not supported
	at io.ktor.features.ContentNegotiation$Feature$install$3.invokeSuspend(ContentNegotiation.kt:100)
	at io.ktor.features.ContentNegotiation$Feature$install$3.invoke(ContentNegotiation.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:131)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:24)
	at io.ktor.request.ApplicationReceiveFunctionsKt.receive(ApplicationReceiveFunctions.kt:68)
	at something.SomethingKt.notes(something.kt:176)
	at something.SomethingKt$api$1.invokeSuspend(something.kt:8)
	at something.SomethingKt$api$1.invoke(something.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:131)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:24)
	at io.ktor.routing.Routing.executeResult(Routing.kt:148)
	at io.ktor.routing.Routing.interceptor(Routing.kt:29)
	at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:93)
	at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:60)
	at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:124)
	at io.ktor.features.CallLogging$Feature$install$2.invoke(CallLogging.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:131)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:24)
	at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:80)
	at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:248)
	at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(PipelineContext.kt:63)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:111)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(PipelineContext.kt:131)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:24)
	at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:31)
	at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt)

This code will throw:

fun Application.config() {
    install(ContentNegotiation) {
        gson {
            serializeNulls()
        }
    }
    // ...
}
fun Application.routes() {
    routing {
        post("/something") {
            data class Foo(var bar: Int)
            data class Bar(var foo: Int)
            val foo = call.receive<Foo>()
            val bar = Bar(foo.bar)
            call.respond(bar)
        }
        // ...
    }
}

This code will works:

data class Foo(var bar: Int)
data class Bar(var foo: Int)

fun Application.config() {
    install(ContentNegotiation) {
        gson {
            serializeNulls()
        }
    }
    // ...
}
fun Application.routes() {
    routing {
        post("/something") {
            val foo = call.receive<Foo>()
            val bar = Bar(foo.bar)
            call.respond(bar)
        }
        // ...
    }
}
@scorsi scorsi changed the title Got "Content type application/json is not supported" exception when the class to serialize is in the function Got "Content type application/json is not supported" exception when the class to serialize/unserialize is in the function Dec 20, 2018
@e5l e5l added the bug label Dec 22, 2018
@cy6erGn0m cy6erGn0m modified the milestones: 1.1.0, 1.1.1 Dec 24, 2018
@cy6erGn0m
Copy link
Contributor

GSON does never deserialize local and anonymous classes thus returns null. Unfortunately ktor doesn't support null deserialization for now so it simply throws UnsupportedMediaTypeException that is confusing.

@cy6erGn0m
Copy link
Contributor

Fixed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants