Skip to content

Commit 701b6bd

Browse files
authored
[kotlin][client] make kotlinx serialization configurable (#20955)
* [kotlin][client] make kotlinx serialization configurable from outside * [kotlin][client] make kotlinx serialization configurable from outside
1 parent 11c5611 commit 701b6bd

File tree

4 files changed

+182
-62
lines changed
  • modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure
  • samples/client/petstore
    • kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure
    • kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure
    • kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure

4 files changed

+182
-62
lines changed

modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ import org.threeten.bp.OffsetDateTime
5050
{{/threetenbp}}
5151
import java.util.UUID
5252
import kotlinx.serialization.json.Json
53+
import kotlinx.serialization.json.JsonBuilder
5354
import kotlinx.serialization.modules.SerializersModule
55+
import kotlinx.serialization.modules.SerializersModuleBuilder
5456
import java.net.URI
5557
import java.net.URL
5658
import java.util.concurrent.atomic.AtomicBoolean
@@ -126,42 +128,70 @@ import java.util.concurrent.atomic.AtomicLong
126128
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}})
127129
{{/jackson}}
128130
{{#kotlinx_serialization}}
129-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
131+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
130132
@JvmStatic
131133
val kotlinSerializationAdapters: SerializersModule
132134
get() { return kotlinxSerializationAdapters }
133135

136+
private var isAdaptersInitialized = false
137+
134138
@JvmStatic
135-
val kotlinxSerializationAdapters = SerializersModule {
136-
contextual(BigDecimal::class, BigDecimalAdapter)
137-
contextual(BigInteger::class, BigIntegerAdapter)
138-
{{^kotlinx-datetime}}
139-
contextual(LocalDate::class, LocalDateAdapter)
140-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
141-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
142-
{{/kotlinx-datetime}}
143-
contextual(UUID::class, UUIDAdapter)
144-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
145-
contextual(AtomicLong::class, AtomicLongAdapter)
146-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
147-
contextual(URI::class, URIAdapter)
148-
contextual(URL::class, URLAdapter)
149-
contextual(StringBuilder::class, StringBuilderAdapter)
139+
val kotlinxSerializationAdapters: SerializersModule by lazy {
140+
isAdaptersInitialized = true
141+
SerializersModule {
142+
contextual(BigDecimal::class, BigDecimalAdapter)
143+
contextual(BigInteger::class, BigIntegerAdapter)
144+
{{^kotlinx-datetime}}
145+
contextual(LocalDate::class, LocalDateAdapter)
146+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
147+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
148+
{{/kotlinx-datetime}}
149+
contextual(UUID::class, UUIDAdapter)
150+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
151+
contextual(AtomicLong::class, AtomicLongAdapter)
152+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
153+
contextual(URI::class, URIAdapter)
154+
contextual(URL::class, URLAdapter)
155+
contextual(StringBuilder::class, StringBuilderAdapter)
156+
157+
apply(kotlinxSerializationAdaptersConfiguration)
158+
}
150159
}
151160

152-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
161+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
162+
set(value) {
163+
check(!isAdaptersInitialized) {
164+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
165+
}
166+
field = value
167+
}
168+
169+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
153170
@JvmStatic
154171
val jvmJson: Json
155172
get() { return kotlinxSerializationJson }
156173

174+
private var isJsonInitialized = false
175+
157176
@JvmStatic
158177
val kotlinxSerializationJson: Json by lazy {
178+
isJsonInitialized = true
159179
Json {
160180
serializersModule = kotlinxSerializationAdapters
161181
encodeDefaults = true
162182
ignoreUnknownKeys = true
163183
isLenient = true
184+
185+
apply(kotlinxSerializationJsonConfiguration)
164186
}
165187
}
188+
189+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
190+
set(value) {
191+
check(!isJsonInitialized) {
192+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
193+
}
194+
field = value
195+
}
166196
{{/kotlinx_serialization}}
167197
}

samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,77 @@ import java.time.LocalDateTime
77
import java.time.OffsetDateTime
88
import java.util.UUID
99
import kotlinx.serialization.json.Json
10+
import kotlinx.serialization.json.JsonBuilder
1011
import kotlinx.serialization.modules.SerializersModule
12+
import kotlinx.serialization.modules.SerializersModuleBuilder
1113
import java.net.URI
1214
import java.net.URL
1315
import java.util.concurrent.atomic.AtomicBoolean
1416
import java.util.concurrent.atomic.AtomicInteger
1517
import java.util.concurrent.atomic.AtomicLong
1618

1719
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
20+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1921
@JvmStatic
2022
val kotlinSerializationAdapters: SerializersModule
2123
get() { return kotlinxSerializationAdapters }
2224

25+
private var isAdaptersInitialized = false
26+
2327
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
28+
val kotlinxSerializationAdapters: SerializersModule by lazy {
29+
isAdaptersInitialized = true
30+
SerializersModule {
31+
contextual(BigDecimal::class, BigDecimalAdapter)
32+
contextual(BigInteger::class, BigIntegerAdapter)
33+
contextual(LocalDate::class, LocalDateAdapter)
34+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
35+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
36+
contextual(UUID::class, UUIDAdapter)
37+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
38+
contextual(AtomicLong::class, AtomicLongAdapter)
39+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
40+
contextual(URI::class, URIAdapter)
41+
contextual(URL::class, URLAdapter)
42+
contextual(StringBuilder::class, StringBuilderAdapter)
43+
44+
apply(kotlinxSerializationAdaptersConfiguration)
45+
}
3746
}
3847

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
48+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
49+
set(value) {
50+
check(!isAdaptersInitialized) {
51+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
52+
}
53+
field = value
54+
}
55+
56+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4057
@JvmStatic
4158
val jvmJson: Json
4259
get() { return kotlinxSerializationJson }
4360

61+
private var isJsonInitialized = false
62+
4463
@JvmStatic
4564
val kotlinxSerializationJson: Json by lazy {
65+
isJsonInitialized = true
4666
Json {
4767
serializersModule = kotlinxSerializationAdapters
4868
encodeDefaults = true
4969
ignoreUnknownKeys = true
5070
isLenient = true
71+
72+
apply(kotlinxSerializationJsonConfiguration)
5173
}
5274
}
75+
76+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
77+
set(value) {
78+
check(!isJsonInitialized) {
79+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
80+
}
81+
field = value
82+
}
5383
}

samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,77 @@ import java.time.LocalDateTime
77
import java.time.OffsetDateTime
88
import java.util.UUID
99
import kotlinx.serialization.json.Json
10+
import kotlinx.serialization.json.JsonBuilder
1011
import kotlinx.serialization.modules.SerializersModule
12+
import kotlinx.serialization.modules.SerializersModuleBuilder
1113
import java.net.URI
1214
import java.net.URL
1315
import java.util.concurrent.atomic.AtomicBoolean
1416
import java.util.concurrent.atomic.AtomicInteger
1517
import java.util.concurrent.atomic.AtomicLong
1618

1719
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
20+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1921
@JvmStatic
2022
val kotlinSerializationAdapters: SerializersModule
2123
get() { return kotlinxSerializationAdapters }
2224

25+
private var isAdaptersInitialized = false
26+
2327
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
28+
val kotlinxSerializationAdapters: SerializersModule by lazy {
29+
isAdaptersInitialized = true
30+
SerializersModule {
31+
contextual(BigDecimal::class, BigDecimalAdapter)
32+
contextual(BigInteger::class, BigIntegerAdapter)
33+
contextual(LocalDate::class, LocalDateAdapter)
34+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
35+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
36+
contextual(UUID::class, UUIDAdapter)
37+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
38+
contextual(AtomicLong::class, AtomicLongAdapter)
39+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
40+
contextual(URI::class, URIAdapter)
41+
contextual(URL::class, URLAdapter)
42+
contextual(StringBuilder::class, StringBuilderAdapter)
43+
44+
apply(kotlinxSerializationAdaptersConfiguration)
45+
}
3746
}
3847

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
48+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
49+
set(value) {
50+
check(!isAdaptersInitialized) {
51+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
52+
}
53+
field = value
54+
}
55+
56+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4057
@JvmStatic
4158
val jvmJson: Json
4259
get() { return kotlinxSerializationJson }
4360

61+
private var isJsonInitialized = false
62+
4463
@JvmStatic
4564
val kotlinxSerializationJson: Json by lazy {
65+
isJsonInitialized = true
4666
Json {
4767
serializersModule = kotlinxSerializationAdapters
4868
encodeDefaults = true
4969
ignoreUnknownKeys = true
5070
isLenient = true
71+
72+
apply(kotlinxSerializationJsonConfiguration)
5173
}
5274
}
75+
76+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
77+
set(value) {
78+
check(!isJsonInitialized) {
79+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
80+
}
81+
field = value
82+
}
5383
}

samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,77 @@ import java.time.LocalDateTime
77
import java.time.OffsetDateTime
88
import java.util.UUID
99
import kotlinx.serialization.json.Json
10+
import kotlinx.serialization.json.JsonBuilder
1011
import kotlinx.serialization.modules.SerializersModule
12+
import kotlinx.serialization.modules.SerializersModuleBuilder
1113
import java.net.URI
1214
import java.net.URL
1315
import java.util.concurrent.atomic.AtomicBoolean
1416
import java.util.concurrent.atomic.AtomicInteger
1517
import java.util.concurrent.atomic.AtomicLong
1618

1719
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
20+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1921
@JvmStatic
2022
val kotlinSerializationAdapters: SerializersModule
2123
get() { return kotlinxSerializationAdapters }
2224

25+
private var isAdaptersInitialized = false
26+
2327
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
28+
val kotlinxSerializationAdapters: SerializersModule by lazy {
29+
isAdaptersInitialized = true
30+
SerializersModule {
31+
contextual(BigDecimal::class, BigDecimalAdapter)
32+
contextual(BigInteger::class, BigIntegerAdapter)
33+
contextual(LocalDate::class, LocalDateAdapter)
34+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
35+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
36+
contextual(UUID::class, UUIDAdapter)
37+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
38+
contextual(AtomicLong::class, AtomicLongAdapter)
39+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
40+
contextual(URI::class, URIAdapter)
41+
contextual(URL::class, URLAdapter)
42+
contextual(StringBuilder::class, StringBuilderAdapter)
43+
44+
apply(kotlinxSerializationAdaptersConfiguration)
45+
}
3746
}
3847

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
48+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
49+
set(value) {
50+
check(!isAdaptersInitialized) {
51+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
52+
}
53+
field = value
54+
}
55+
56+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4057
@JvmStatic
4158
val jvmJson: Json
4259
get() { return kotlinxSerializationJson }
4360

61+
private var isJsonInitialized = false
62+
4463
@JvmStatic
4564
val kotlinxSerializationJson: Json by lazy {
65+
isJsonInitialized = true
4666
Json {
4767
serializersModule = kotlinxSerializationAdapters
4868
encodeDefaults = true
4969
ignoreUnknownKeys = true
5070
isLenient = true
71+
72+
apply(kotlinxSerializationJsonConfiguration)
5173
}
5274
}
75+
76+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
77+
set(value) {
78+
check(!isJsonInitialized) {
79+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
80+
}
81+
field = value
82+
}
5383
}

0 commit comments

Comments
 (0)