diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache index 418523fc590..7ba381ea549 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache @@ -50,7 +50,9 @@ import org.threeten.bp.OffsetDateTime {{/threetenbp}} import java.util.UUID import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonBuilder import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.SerializersModuleBuilder import java.net.URI import java.net.URL import java.util.concurrent.atomic.AtomicBoolean @@ -126,42 +128,70 @@ import java.util.concurrent.atomic.AtomicLong .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}}) {{/jackson}} {{#kotlinx_serialization}} - @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters")) + @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR) @JvmStatic val kotlinSerializationAdapters: SerializersModule get() { return kotlinxSerializationAdapters } + private var isAdaptersInitialized = false + @JvmStatic - val kotlinxSerializationAdapters = SerializersModule { - contextual(BigDecimal::class, BigDecimalAdapter) - contextual(BigInteger::class, BigIntegerAdapter) - {{^kotlinx-datetime}} - contextual(LocalDate::class, LocalDateAdapter) - contextual(LocalDateTime::class, LocalDateTimeAdapter) - contextual(OffsetDateTime::class, OffsetDateTimeAdapter) - {{/kotlinx-datetime}} - contextual(UUID::class, UUIDAdapter) - contextual(AtomicInteger::class, AtomicIntegerAdapter) - contextual(AtomicLong::class, AtomicLongAdapter) - contextual(AtomicBoolean::class, AtomicBooleanAdapter) - contextual(URI::class, URIAdapter) - contextual(URL::class, URLAdapter) - contextual(StringBuilder::class, StringBuilderAdapter) + val kotlinxSerializationAdapters: SerializersModule by lazy { + isAdaptersInitialized = true + SerializersModule { + contextual(BigDecimal::class, BigDecimalAdapter) + contextual(BigInteger::class, BigIntegerAdapter) + {{^kotlinx-datetime}} + contextual(LocalDate::class, LocalDateAdapter) + contextual(LocalDateTime::class, LocalDateTimeAdapter) + contextual(OffsetDateTime::class, OffsetDateTimeAdapter) + {{/kotlinx-datetime}} + contextual(UUID::class, UUIDAdapter) + contextual(AtomicInteger::class, AtomicIntegerAdapter) + contextual(AtomicLong::class, AtomicLongAdapter) + contextual(AtomicBoolean::class, AtomicBooleanAdapter) + contextual(URI::class, URIAdapter) + contextual(URL::class, URLAdapter) + contextual(StringBuilder::class, StringBuilderAdapter) + + apply(kotlinxSerializationAdaptersConfiguration) + } } - @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson")) + var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {} + set(value) { + check(!isAdaptersInitialized) { + "Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized." + } + field = value + } + + @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR) @JvmStatic val jvmJson: Json get() { return kotlinxSerializationJson } + private var isJsonInitialized = false + @JvmStatic val kotlinxSerializationJson: Json by lazy { + isJsonInitialized = true Json { serializersModule = kotlinxSerializationAdapters encodeDefaults = true ignoreUnknownKeys = true isLenient = true + + apply(kotlinxSerializationJsonConfiguration) } } + + var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {} + set(value) { + check(!isJsonInitialized) { + "Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized." + } + field = value + } {{/kotlinx_serialization}} } diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt index 951484b2180..62679718122 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt @@ -7,7 +7,9 @@ import java.time.LocalDateTime import java.time.OffsetDateTime import java.util.UUID import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonBuilder import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.SerializersModuleBuilder import java.net.URI import java.net.URL import java.util.concurrent.atomic.AtomicBoolean @@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicLong object Serializer { - @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters")) + @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR) @JvmStatic val kotlinSerializationAdapters: SerializersModule get() { return kotlinxSerializationAdapters } + private var isAdaptersInitialized = false + @JvmStatic - val kotlinxSerializationAdapters = SerializersModule { - contextual(BigDecimal::class, BigDecimalAdapter) - contextual(BigInteger::class, BigIntegerAdapter) - contextual(LocalDate::class, LocalDateAdapter) - contextual(LocalDateTime::class, LocalDateTimeAdapter) - contextual(OffsetDateTime::class, OffsetDateTimeAdapter) - contextual(UUID::class, UUIDAdapter) - contextual(AtomicInteger::class, AtomicIntegerAdapter) - contextual(AtomicLong::class, AtomicLongAdapter) - contextual(AtomicBoolean::class, AtomicBooleanAdapter) - contextual(URI::class, URIAdapter) - contextual(URL::class, URLAdapter) - contextual(StringBuilder::class, StringBuilderAdapter) + val kotlinxSerializationAdapters: SerializersModule by lazy { + isAdaptersInitialized = true + SerializersModule { + contextual(BigDecimal::class, BigDecimalAdapter) + contextual(BigInteger::class, BigIntegerAdapter) + contextual(LocalDate::class, LocalDateAdapter) + contextual(LocalDateTime::class, LocalDateTimeAdapter) + contextual(OffsetDateTime::class, OffsetDateTimeAdapter) + contextual(UUID::class, UUIDAdapter) + contextual(AtomicInteger::class, AtomicIntegerAdapter) + contextual(AtomicLong::class, AtomicLongAdapter) + contextual(AtomicBoolean::class, AtomicBooleanAdapter) + contextual(URI::class, URIAdapter) + contextual(URL::class, URLAdapter) + contextual(StringBuilder::class, StringBuilderAdapter) + + apply(kotlinxSerializationAdaptersConfiguration) + } } - @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson")) + var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {} + set(value) { + check(!isAdaptersInitialized) { + "Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized." + } + field = value + } + + @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR) @JvmStatic val jvmJson: Json get() { return kotlinxSerializationJson } + private var isJsonInitialized = false + @JvmStatic val kotlinxSerializationJson: Json by lazy { + isJsonInitialized = true Json { serializersModule = kotlinxSerializationAdapters encodeDefaults = true ignoreUnknownKeys = true isLenient = true + + apply(kotlinxSerializationJsonConfiguration) } } + + var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {} + set(value) { + check(!isJsonInitialized) { + "Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized." + } + field = value + } } diff --git a/samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt index 951484b2180..62679718122 100644 --- a/samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt +++ b/samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt @@ -7,7 +7,9 @@ import java.time.LocalDateTime import java.time.OffsetDateTime import java.util.UUID import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonBuilder import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.SerializersModuleBuilder import java.net.URI import java.net.URL import java.util.concurrent.atomic.AtomicBoolean @@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicLong object Serializer { - @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters")) + @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR) @JvmStatic val kotlinSerializationAdapters: SerializersModule get() { return kotlinxSerializationAdapters } + private var isAdaptersInitialized = false + @JvmStatic - val kotlinxSerializationAdapters = SerializersModule { - contextual(BigDecimal::class, BigDecimalAdapter) - contextual(BigInteger::class, BigIntegerAdapter) - contextual(LocalDate::class, LocalDateAdapter) - contextual(LocalDateTime::class, LocalDateTimeAdapter) - contextual(OffsetDateTime::class, OffsetDateTimeAdapter) - contextual(UUID::class, UUIDAdapter) - contextual(AtomicInteger::class, AtomicIntegerAdapter) - contextual(AtomicLong::class, AtomicLongAdapter) - contextual(AtomicBoolean::class, AtomicBooleanAdapter) - contextual(URI::class, URIAdapter) - contextual(URL::class, URLAdapter) - contextual(StringBuilder::class, StringBuilderAdapter) + val kotlinxSerializationAdapters: SerializersModule by lazy { + isAdaptersInitialized = true + SerializersModule { + contextual(BigDecimal::class, BigDecimalAdapter) + contextual(BigInteger::class, BigIntegerAdapter) + contextual(LocalDate::class, LocalDateAdapter) + contextual(LocalDateTime::class, LocalDateTimeAdapter) + contextual(OffsetDateTime::class, OffsetDateTimeAdapter) + contextual(UUID::class, UUIDAdapter) + contextual(AtomicInteger::class, AtomicIntegerAdapter) + contextual(AtomicLong::class, AtomicLongAdapter) + contextual(AtomicBoolean::class, AtomicBooleanAdapter) + contextual(URI::class, URIAdapter) + contextual(URL::class, URLAdapter) + contextual(StringBuilder::class, StringBuilderAdapter) + + apply(kotlinxSerializationAdaptersConfiguration) + } } - @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson")) + var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {} + set(value) { + check(!isAdaptersInitialized) { + "Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized." + } + field = value + } + + @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR) @JvmStatic val jvmJson: Json get() { return kotlinxSerializationJson } + private var isJsonInitialized = false + @JvmStatic val kotlinxSerializationJson: Json by lazy { + isJsonInitialized = true Json { serializersModule = kotlinxSerializationAdapters encodeDefaults = true ignoreUnknownKeys = true isLenient = true + + apply(kotlinxSerializationJsonConfiguration) } } + + var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {} + set(value) { + check(!isJsonInitialized) { + "Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized." + } + field = value + } } diff --git a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt index 951484b2180..62679718122 100644 --- a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt +++ b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt @@ -7,7 +7,9 @@ import java.time.LocalDateTime import java.time.OffsetDateTime import java.util.UUID import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonBuilder import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.SerializersModuleBuilder import java.net.URI import java.net.URL import java.util.concurrent.atomic.AtomicBoolean @@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicLong object Serializer { - @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters")) + @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR) @JvmStatic val kotlinSerializationAdapters: SerializersModule get() { return kotlinxSerializationAdapters } + private var isAdaptersInitialized = false + @JvmStatic - val kotlinxSerializationAdapters = SerializersModule { - contextual(BigDecimal::class, BigDecimalAdapter) - contextual(BigInteger::class, BigIntegerAdapter) - contextual(LocalDate::class, LocalDateAdapter) - contextual(LocalDateTime::class, LocalDateTimeAdapter) - contextual(OffsetDateTime::class, OffsetDateTimeAdapter) - contextual(UUID::class, UUIDAdapter) - contextual(AtomicInteger::class, AtomicIntegerAdapter) - contextual(AtomicLong::class, AtomicLongAdapter) - contextual(AtomicBoolean::class, AtomicBooleanAdapter) - contextual(URI::class, URIAdapter) - contextual(URL::class, URLAdapter) - contextual(StringBuilder::class, StringBuilderAdapter) + val kotlinxSerializationAdapters: SerializersModule by lazy { + isAdaptersInitialized = true + SerializersModule { + contextual(BigDecimal::class, BigDecimalAdapter) + contextual(BigInteger::class, BigIntegerAdapter) + contextual(LocalDate::class, LocalDateAdapter) + contextual(LocalDateTime::class, LocalDateTimeAdapter) + contextual(OffsetDateTime::class, OffsetDateTimeAdapter) + contextual(UUID::class, UUIDAdapter) + contextual(AtomicInteger::class, AtomicIntegerAdapter) + contextual(AtomicLong::class, AtomicLongAdapter) + contextual(AtomicBoolean::class, AtomicBooleanAdapter) + contextual(URI::class, URIAdapter) + contextual(URL::class, URLAdapter) + contextual(StringBuilder::class, StringBuilderAdapter) + + apply(kotlinxSerializationAdaptersConfiguration) + } } - @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson")) + var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {} + set(value) { + check(!isAdaptersInitialized) { + "Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized." + } + field = value + } + + @Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR) @JvmStatic val jvmJson: Json get() { return kotlinxSerializationJson } + private var isJsonInitialized = false + @JvmStatic val kotlinxSerializationJson: Json by lazy { + isJsonInitialized = true Json { serializersModule = kotlinxSerializationAdapters encodeDefaults = true ignoreUnknownKeys = true isLenient = true + + apply(kotlinxSerializationJsonConfiguration) } } + + var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {} + set(value) { + check(!isJsonInitialized) { + "Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized." + } + field = value + } }