Skip to content

Commit 60adf19

Browse files
committed
feat(kotlin-client): add Jackson 3 support with useJackson3 option
Wire the existing AbstractKotlinCodegen Jackson 3 infrastructure into the kotlin client generator. When useJackson3=true (requires serializationLibrary=jackson), all templates use the tools.jackson package instead of com.fasterxml.jackson, and build.gradle pulls jackson-module-kotlin 3.0.1 without the separate JSR-310 module. - Register useJackson3 CLI option in KotlinClientCodegen - Add validation: requires jackson serialization, incompatible with openApiNullable - Replace hardcoded com.fasterxml.jackson with {{jacksonPackage}} in all model, serializer, and library-specific templates - Make JavaTimeModule conditional (not needed in Jackson 3) for jvm-ktor - Add Jackson 3 dependency block in build.gradle.mustache - Add tests for validation and generated output - Add kotlin-jackson3 sample config and generated sample - Add sample to CI workflow matrix - Regenerate generator docs
1 parent a2fd144 commit 60adf19

67 files changed

Lines changed: 4984 additions & 40 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/samples-kotlin-client.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
- samples/client/petstore/kotlin-explicit
2727
- samples/client/petstore/kotlin-gson
2828
- samples/client/petstore/kotlin-jackson
29+
- samples/client/petstore/kotlin-jackson3
2930
- samples/client/petstore/kotlin-model-prefix-type-mappings
3031
# needs Android configured
3132
#- samples/client/petstore/kotlin-json-request-string

bin/configs/kotlin-jackson3.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
generatorName: kotlin
2+
outputDir: samples/client/petstore/kotlin-jackson3
3+
inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/kotlin-client
5+
additionalProperties:
6+
serializationLibrary: jackson
7+
useJackson3: "true"
8+
artifactId: kotlin-petstore-jackson3
9+
enumPropertyNaming: UPPERCASE
10+
enumUnknownDefaultCase: "true"

docs/generators/kotlin.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5050
|sourceFolder|source folder for generated code| |src/main/kotlin|
5151
|supportAndroidApiLevel25AndBelow|[WARNING] This flag will generate code that has a known security vulnerability. It uses `kotlin.io.createTempFile` instead of `java.nio.file.Files.createTempFile` in order to support Android API level 25 and below. For more info, please check the following links https://github.com/OpenAPITools/openapi-generator/security/advisories/GHSA-23x4-m842-fmwf, https://github.com/OpenAPITools/openapi-generator/pull/9284| |false|
5252
|useCoroutines|Whether to use the Coroutines adapter with the retrofit2 library.| |false|
53-
|useJackson3|Use Jackson 3 dependencies (tools.jackson package). Not yet supported for kotlin-client; reserved for future use.| |false|
53+
|useJackson3|Use Jackson 3 dependencies (tools.jackson package). Requires serializationLibrary=jackson. Incompatible with openApiNullable.| |false|
5454
|useNonAsciiHeaders|Allow to use non-ascii headers with the okhttp library| |false|
5555
|useResponseAsReturnType|When using retrofit2 and coroutines, use `Response`<`T`> as return type instead of `T`.| |true|
5656
|useRxJava3|Whether to use the RxJava3 adapter with the retrofit2 library.| |false|

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ public KotlinClientCodegen() {
300300
cliOptions.add(CliOption.newBoolean(USE_RESPONSE_AS_RETURN_TYPE, "When using retrofit2 and coroutines, use `Response`<`T`> as return type instead of `T`.", true));
301301

302302
cliOptions.add(CliOption.newBoolean(USE_JACKSON_3,
303-
"Use Jackson 3 dependencies (tools.jackson package). Not yet supported for kotlin-client; reserved for future use."));
303+
"Use Jackson 3 dependencies (tools.jackson package). Requires serializationLibrary=jackson. Incompatible with openApiNullable."));
304304
}
305305

306306
@Override
@@ -481,6 +481,16 @@ public void processOpts() {
481481
additionalProperties.put(this.serializationLibrary.name(), true);
482482
}
483483

484+
if (isUseJackson3()) {
485+
if (this.serializationLibrary != SERIALIZATION_LIBRARY_TYPE.jackson) {
486+
throw new IllegalArgumentException("useJackson3 requires serializationLibrary=jackson");
487+
}
488+
if (additionalProperties.containsKey("openApiNullable")
489+
&& Boolean.parseBoolean(additionalProperties.get("openApiNullable").toString())) {
490+
throw new IllegalArgumentException("openApiNullable cannot be set with useJackson3");
491+
}
492+
}
493+
484494
if (additionalProperties.containsKey(MAP_FILE_BINARY_TO_BYTE_ARRAY)) {
485495
setMapFileBinaryToByteArray(convertPropertyToBooleanAndWriteBack(MAP_FILE_BINARY_TO_BYTE_ARRAY));
486496
}

modules/openapi-generator/src/main/resources/kotlin-client/anyof_class.mustache

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ import com.squareup.moshi.JsonClass
1818
{{/moshi}}
1919
{{#jackson}}
2020
{{#enumUnknownDefaultCase}}
21-
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue
21+
import {{jacksonPackage}}.annotation.JsonEnumDefaultValue
2222
{{/enumUnknownDefaultCase}}
23-
import com.fasterxml.jackson.annotation.JsonProperty
23+
import {{jacksonPackage}}.annotation.JsonProperty
2424
{{#discriminator}}
25-
import com.fasterxml.jackson.annotation.JsonSubTypes
26-
import com.fasterxml.jackson.annotation.JsonTypeInfo
25+
import {{jacksonPackage}}.annotation.JsonSubTypes
26+
import {{jacksonPackage}}.annotation.JsonTypeInfo
2727
{{/discriminator}}
2828
{{/jackson}}
2929
{{#kotlinx_serialization}}

modules/openapi-generator/src/main/resources/kotlin-client/build.gradle.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,13 @@ dependencies {
163163
{{/gson}}
164164
{{#jackson}}
165165
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
166+
{{#useJackson3}}
167+
implementation "tools.jackson.module:jackson-module-kotlin:3.0.1"
168+
{{/useJackson3}}
169+
{{^useJackson3}}
166170
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.20.0"
167171
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.0"
172+
{{/useJackson3}}
168173
{{/jackson}}
169174
{{#kotlinx_serialization}}
170175
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0"

modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ import com.squareup.moshi.JsonClass
1919
{{/moshi}}
2020
{{#jackson}}
2121
{{#enumUnknownDefaultCase}}
22-
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue
22+
import {{jacksonPackage}}.annotation.JsonEnumDefaultValue
2323
{{/enumUnknownDefaultCase}}
24-
import com.fasterxml.jackson.annotation.JsonProperty
24+
import {{jacksonPackage}}.annotation.JsonProperty
2525
{{#discriminator}}
26-
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
27-
import com.fasterxml.jackson.annotation.JsonSubTypes
28-
import com.fasterxml.jackson.annotation.JsonTypeInfo
26+
import {{jacksonPackage}}.annotation.JsonIgnoreProperties
27+
import {{jacksonPackage}}.annotation.JsonSubTypes
28+
import {{jacksonPackage}}.annotation.JsonTypeInfo
2929
{{/discriminator}}
3030
{{/jackson}}
3131
{{#kotlinx_serialization}}

modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import com.squareup.moshi.Json
77
import com.squareup.moshi.JsonClass
88
{{/moshi}}
99
{{#jackson}}
10-
import com.fasterxml.jackson.annotation.JsonCreator
10+
import {{jacksonPackage}}.annotation.JsonCreator
1111
{{#enumUnknownDefaultCase}}
12-
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue
12+
import {{jacksonPackage}}.annotation.JsonEnumDefaultValue
1313
{{/enumUnknownDefaultCase}}
14-
import com.fasterxml.jackson.annotation.JsonProperty
15-
import com.fasterxml.jackson.annotation.JsonValue
14+
import {{jacksonPackage}}.annotation.JsonProperty
15+
import {{jacksonPackage}}.annotation.JsonValue
1616
import kotlin.jvm.JvmStatic
1717
{{/jackson}}
1818
{{#kotlinx_serialization}}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ import kotlinx.datetime.LocalTime
3030
import java.util.UUID
3131
{{/gson}}
3232
{{#jackson}}
33-
import com.fasterxml.jackson.databind.DeserializationFeature
34-
import com.fasterxml.jackson.databind.ObjectMapper
35-
import com.fasterxml.jackson.databind.SerializationFeature
36-
import com.fasterxml.jackson.annotation.JsonInclude
37-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
33+
import {{jacksonPackage}}.databind.DeserializationFeature
34+
import {{jacksonPackage}}.databind.ObjectMapper
35+
import {{jacksonPackage}}.databind.SerializationFeature
36+
import {{jacksonPackage}}.annotation.JsonInclude
37+
import {{jacksonPackage}}.module.kotlin.jacksonObjectMapper
3838
{{/jackson}}
3939
{{#kotlinx_serialization}}
4040
import java.math.BigDecimal

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-ktor/api.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import com.google.gson.GsonBuilder
1515
import java.text.DateFormat
1616
{{/gson}}
1717
{{#jackson}}
18-
import com.fasterxml.jackson.databind.ObjectMapper
18+
import {{jacksonPackage}}.databind.ObjectMapper
1919
{{/jackson}}
2020

2121
{{#operations}}

0 commit comments

Comments
 (0)