Skip to content

Commit 89f152e

Browse files
yonatankarpclaude
andcommitted
fix(kotlin-client): fix Jackson 3 package imports and add ktor/spring-restclient support
Replace hardcoded com.fasterxml.jackson imports with {{jacksonPackage}} template variable across all kotlin-client templates so generated code compiles correctly when useJackson3=true. Also fix trailing space in OAuth Bearer header, enable useJackson3 for jvm-ktor (Ktor 3.4.0) and jvm-spring-restclient (Spring Boot 4), and add conditional Jackson 3 dependencies in build.gradle. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4bfbcc6 commit 89f152e

17 files changed

Lines changed: 113 additions & 28 deletions

File tree

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,9 @@ public KotlinClientCodegen() {
293293

294294
cliOptions.add(CliOption.newBoolean(USE_NON_ASCII_HEADERS, "Allow to use non-ascii headers with the okhttp library"));
295295
cliOptions.add(CliOption.newBoolean(USE_RESPONSE_AS_RETURN_TYPE, "When using retrofit2 and coroutines, use `Response`<`T`> as return type instead of `T`.", true));
296+
297+
cliOptions.add(CliOption.newBoolean(USE_JACKSON_3,
298+
"Use Jackson 3 dependencies (tools.jackson package). Requires serializationLibrary=jackson. Incompatible with openApiNullable. Only supported with jvm-okhttp4 and jvm-vertx libraries."));
296299
}
297300

298301
@Override
@@ -464,6 +467,21 @@ public void processOpts() {
464467
additionalProperties.put(this.serializationLibrary.name(), true);
465468
}
466469

470+
if (isUseJackson3()) {
471+
if (this.serializationLibrary != SERIALIZATION_LIBRARY_TYPE.jackson) {
472+
throw new IllegalArgumentException("useJackson3 requires serializationLibrary=jackson");
473+
}
474+
if (additionalProperties.containsKey("openApiNullable")
475+
&& Boolean.parseBoolean(additionalProperties.get("openApiNullable").toString())) {
476+
throw new IllegalArgumentException("openApiNullable cannot be set with useJackson3");
477+
}
478+
String lib = getLibrary();
479+
if (!JVM_OKHTTP4.equals(lib) && !JVM_VERTX.equals(lib) && !JVM_KTOR.equals(lib) && !JVM_SPRING_RESTCLIENT.equals(lib)) {
480+
throw new IllegalArgumentException(
481+
"useJackson3 is only supported with jvm-okhttp4, jvm-vertx, jvm-ktor, and jvm-spring-restclient libraries, but got: " + lib);
482+
}
483+
}
484+
467485
if (additionalProperties.containsKey(MAP_FILE_BINARY_TO_BYTE_ARRAY)) {
468486
setMapFileBinaryToByteArray(convertPropertyToBooleanAndWriteBack(MAP_FILE_BINARY_TO_BYTE_ARRAY));
469487
}

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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ wrapper {
1111
buildscript {
1212
ext.kotlin_version = '2.2.20'
1313
{{#jvm-ktor}}
14+
{{#useJackson3}}
15+
ext.ktor_version = '3.4.0'
16+
{{/useJackson3}}
17+
{{^useJackson3}}
1418
ext.ktor_version = '3.2.3'
19+
{{/useJackson3}}
1520
{{/jvm-ktor}}
1621
{{#jvm-retrofit2}}
1722
ext.retrofitVersion = '3.0.0'
@@ -23,12 +28,17 @@ buildscript {
2328
ext.vertx_version = "5.0.4"
2429
{{/jvm-vertx}}
2530
{{#jvm-spring}}
31+
{{#useJackson3}}
32+
ext.spring_boot_version = "4.0.3"
33+
{{/useJackson3}}
34+
{{^useJackson3}}
2635
{{#useSpringBoot3}}
2736
ext.spring_boot_version = "3.5.5"
2837
{{/useSpringBoot3}}
2938
{{^useSpringBoot3}}
3039
ext.spring_boot_version = "2.7.18"
3140
{{/useSpringBoot3}}
41+
{{/useJackson3}}
3242
{{/jvm-spring}}
3343
ext.spotless_version = "7.2.1"
3444

@@ -163,8 +173,13 @@ dependencies {
163173
{{/gson}}
164174
{{#jackson}}
165175
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
176+
{{#useJackson3}}
177+
implementation "tools.jackson.module:jackson-module-kotlin:3.0.1"
178+
{{/useJackson3}}
179+
{{^useJackson3}}
166180
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.20.0"
167181
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.0"
182+
{{/useJackson3}}
168183
{{/jackson}}
169184
{{#kotlinx_serialization}}
170185
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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,24 @@ import kotlinx.datetime.LocalTime
3030
import java.util.UUID
3131
{{/gson}}
3232
{{#jackson}}
33+
{{^useJackson3}}
3334
import com.fasterxml.jackson.databind.DeserializationFeature
3435
import com.fasterxml.jackson.databind.ObjectMapper
3536
import com.fasterxml.jackson.databind.SerializationFeature
3637
import com.fasterxml.jackson.annotation.JsonInclude
3738
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
39+
{{/useJackson3}}
40+
{{#useJackson3}}
41+
import {{jacksonPackage}}.databind.DeserializationFeature
42+
import {{jacksonPackage}}.databind.ObjectMapper
43+
import {{jacksonPackage}}.databind.cfg.DateTimeFeature
44+
{{#enumUnknownDefaultCase}}
45+
import {{jacksonPackage}}.databind.cfg.EnumFeature
46+
{{/enumUnknownDefaultCase}}
47+
import {{jacksonPackage}}.annotation.JsonInclude
48+
import {{jacksonPackage}}.module.kotlin.jsonMapper
49+
import {{jacksonPackage}}.module.kotlin.kotlinModule
50+
{{/useJackson3}}
3851
{{/jackson}}
3952
{{#kotlinx_serialization}}
4053
import java.math.BigDecimal
@@ -120,6 +133,7 @@ import java.util.concurrent.atomic.AtomicLong
120133
}
121134
{{/gson}}
122135
{{#jackson}}
136+
{{^useJackson3}}
123137
@JvmStatic
124138
val jacksonObjectMapper: ObjectMapper = jacksonObjectMapper()
125139
.findAndRegisterModules()
@@ -129,6 +143,24 @@ import java.util.concurrent.atomic.AtomicLong
129143
{{/enumUnknownDefaultCase}}
130144
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
131145
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}})
146+
{{/useJackson3}}
147+
{{#useJackson3}}
148+
@JvmStatic
149+
val jacksonObjectMapper: ObjectMapper = jsonMapper {
150+
addModule(kotlinModule())
151+
changeDefaultPropertyInclusion { it.withValueInclusion(JsonInclude.Include.NON_ABSENT) }
152+
{{#enumUnknownDefaultCase}}
153+
enable(EnumFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
154+
{{/enumUnknownDefaultCase}}
155+
disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
156+
{{#failOnUnknownProperties}}
157+
enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
158+
{{/failOnUnknownProperties}}
159+
{{^failOnUnknownProperties}}
160+
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
161+
{{/failOnUnknownProperties}}
162+
}
163+
{{/useJackson3}}
132164
{{/jackson}}
133165
{{#kotlinx_serialization}}
134166
private var isAdaptersInitialized = false

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}}

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-ktor/infrastructure/ApiClient.kt.mustache

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,20 @@ import java.text.DateFormat
2929
{{/gson}}
3030
{{#jackson}}
3131
import io.ktor.serialization.jackson.*
32+
{{^useJackson3}}
3233
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
3334
import com.fasterxml.jackson.databind.ObjectMapper
3435
import com.fasterxml.jackson.databind.SerializationFeature
3536
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
3637
import com.fasterxml.jackson.core.util.DefaultIndenter
3738
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter
39+
{{/useJackson3}}
40+
{{#useJackson3}}
41+
import {{jacksonPackage}}.databind.ObjectMapper
42+
import {{jacksonPackage}}.databind.SerializationFeature
43+
import {{jacksonPackage}}.core.util.DefaultIndenter
44+
import {{jacksonPackage}}.core.util.DefaultPrettyPrinter
45+
{{/useJackson3}}
3846
{{/jackson}}
3947
import {{packageName}}.auth.*
4048

@@ -96,7 +104,9 @@ import {{packageName}}.auth.*
96104
indentArraysWith(DefaultPrettyPrinter.FixedSpaceIndenter.instance)
97105
indentObjectsWith(DefaultIndenter(" ", "\n"))
98106
})
107+
{{^useJackson3}}
99108
registerModule(JavaTimeModule())
109+
{{/useJackson3}}
100110
}
101111
{{/jackson}}
102112
protected val UNSAFE_HEADERS: List<String> = listOf(HttpHeaders.ContentType)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import com.google.gson.annotations.SerializedName
1616
import com.squareup.moshi.Json
1717
{{/moshi}}
1818
{{#jackson}}
19-
import com.fasterxml.jackson.annotation.JsonProperty
19+
import {{jacksonPackage}}.annotation.JsonProperty
2020
{{/jackson}}
2121
{{#kotlinx_serialization}}
2222
import kotlinx.serialization.SerialName

modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-okhttp/infrastructure/ApiClient.kt.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import org.threeten.bp.OffsetTime
5353
import com.google.gson.reflect.TypeToken
5454
{{/gson}}
5555
{{#jackson}}
56-
import com.fasterxml.jackson.core.type.TypeReference
56+
import {{jacksonPackage}}.core.type.TypeReference
5757
{{/jackson}}
5858
{{#moshi}}
5959
import com.squareup.moshi.adapter
@@ -413,7 +413,7 @@ import com.squareup.moshi.adapter
413413
{{#isOAuth}}
414414
if (requestConfig.headers[Authorization].isNullOrEmpty()) {
415415
accessToken?.let { accessToken ->
416-
requestConfig.headers[Authorization] = "Bearer $accessToken "
416+
requestConfig.headers[Authorization] = "Bearer $accessToken"
417417
}
418418
}
419419
{{/isOAuth}}

0 commit comments

Comments
 (0)