Skip to content

Commit 6b3e74d

Browse files
authored
Merge pull request #226 from RaySmith-ttc/fix/exmaple-encoder
Fix ExampleEncoder.kotlinx()
2 parents bf16fc3 + b0eec58 commit 6b3e74d

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

ktor-openapi/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ dependencies {
6060
val versionMockk: String by project
6161
testImplementation("io.mockk:mockk:$versionMockk")
6262

63+
val versionLogback: String by project
64+
testImplementation("ch.qos.logback:logback-classic:$versionLogback")
65+
6366
}
6467

6568
kotlin {

ktor-openapi/src/main/kotlin/io/github/smiley4/ktoropenapi/config/ExampleEncoder.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.github.smiley4.ktoropenapi.config
22

3-
import com.fasterxml.jackson.core.type.TypeReference
4-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
53
import io.github.smiley4.ktoropenapi.config.descriptors.KTypeDescriptor
64
import io.github.smiley4.ktoropenapi.config.descriptors.TypeDescriptor
75
import kotlinx.serialization.json.Json
@@ -31,9 +29,8 @@ object ExampleEncoder {
3129
when(type) {
3230
is KTypeDescriptor -> {
3331
val jsonEncoder = json ?: Json
34-
val jsonString = jsonEncoder.encodeToString(serializer(type.type), example)
35-
val jsonObj = jacksonObjectMapper().readValue(jsonString, object : TypeReference<Any>() {})
36-
jsonObj
32+
val serializer = jsonEncoder.serializersModule.serializer(type.type)
33+
jsonEncoder.encodeToString(serializer, example)
3734
}
3835
else -> example
3936
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package io.github.smiley4.ktorswaggerui.misc
2+
3+
import io.github.smiley4.ktoropenapi.OpenApi
4+
import io.github.smiley4.ktoropenapi.config.ExampleEncoder
5+
import io.github.smiley4.ktoropenapi.get
6+
import io.github.smiley4.ktoropenapi.openApi
7+
import io.kotest.core.spec.style.StringSpec
8+
import io.kotest.matchers.shouldNotBe
9+
import io.ktor.client.request.get
10+
import io.ktor.client.statement.bodyAsText
11+
import io.ktor.http.HttpStatusCode
12+
import io.ktor.server.response.respond
13+
import io.ktor.server.routing.route
14+
import io.ktor.server.testing.testApplication
15+
import kotlinx.serialization.KSerializer
16+
import kotlinx.serialization.descriptors.PrimitiveKind
17+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
18+
import kotlinx.serialization.descriptors.SerialDescriptor
19+
import kotlinx.serialization.encoding.Decoder
20+
import kotlinx.serialization.encoding.Encoder
21+
import kotlinx.serialization.json.Json
22+
import kotlinx.serialization.modules.SerializersModule
23+
import java.time.LocalDate
24+
import java.time.format.DateTimeFormatter
25+
26+
27+
class ExampleEncoderTest : StringSpec({
28+
29+
val json = Json {
30+
classDiscriminator = "_type"
31+
serializersModule = SerializersModule {
32+
contextual(LocalDate::class, object : KSerializer<LocalDate> {
33+
private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE
34+
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
35+
override fun deserialize(decoder: Decoder) = LocalDate.parse(decoder.decodeString(), formatter)
36+
override fun serialize(encoder: Encoder, value: LocalDate) = encoder.encodeString(formatter.format(value))
37+
})
38+
}
39+
}
40+
41+
"ExampleEncoder.kotlinx should not fail with contextual type" {
42+
testApplication {
43+
install(OpenApi) {
44+
examples {
45+
encoder(ExampleEncoder.kotlinx(json))
46+
}
47+
}
48+
routing {
49+
route("api.yml") {
50+
openApi()
51+
}
52+
53+
get("test", {
54+
response {
55+
HttpStatusCode.OK to {
56+
body<LocalDate> {
57+
example("example") {
58+
value = LocalDate.of(2025, 12, 9)
59+
}
60+
}
61+
}
62+
}
63+
}) {
64+
call.respond(HttpStatusCode.OK)
65+
}
66+
}
67+
68+
createClient {}.get("api.yml").bodyAsText() shouldNotBe "{}"
69+
}
70+
}
71+
})

0 commit comments

Comments
 (0)