Skip to content

Commit 159c93d

Browse files
authored
feat(kotlin): Add support for Jackson3 and SpringBoot 4 (#24709)
* feat(kotlin): Add support for Jackson3 and SpringBoot 4 Add support for generating Kotlin client with Jackson3 and SpringBoot4 with okHttp and spring-restclient. Based on the work of @yonatankarp Fixes #23114 * Correct and update docs, add Jackson registerDefaults Make the jvm-spring-restclient implementation like the Java restclient implementation * Fix check for jvm-spring-restclient jackson * Update samples * Fix placement of registerDefaults
1 parent 9a0e7ae commit 159c93d

99 files changed

Lines changed: 9222 additions & 11 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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
- samples/client/petstore/kotlin-explicit
3232
- samples/client/petstore/kotlin-gson
3333
- samples/client/petstore/kotlin-jackson
34+
- samples/client/petstore/kotlin-jackson3
3435
- samples/client/petstore/kotlin-model-prefix-type-mappings
3536
# needs Android configured
3637
#- samples/client/petstore/kotlin-json-request-string
@@ -74,6 +75,7 @@ jobs:
7475
- samples/client/petstore/kotlin-jvm-spring-3-restclient
7576
- samples/client/echo_api/kotlin-jvm-spring-3-restclient
7677
- samples/client/others/kotlin-jvm-spring-3-restclient-nullable-return
78+
- samples/client/petstore/kotlin-jvm-spring-4-restclient-jackson3
7779
- samples/client/petstore/kotlin-name-parameter-mappings
7880
- samples/client/others/kotlin-jvm-okhttp-parameter-tests
7981
- samples/client/others/kotlin-jvm-okhttp-path-comments

‎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"
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-jvm-spring-4-restclient-jackson3
3+
library: jvm-spring-restclient
4+
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
5+
templateDir: modules/openapi-generator/src/main/resources/kotlin-client
6+
additionalProperties:
7+
artifactId: kotlin-petstore-spring4-restclient-jackson3
8+
enumUnknownDefaultCase: true
9+
serializationLibrary: jackson
10+
useSpringBoot4: true

‎docs/generators/kotlin.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3232
|groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools|
3333
|idea|Add IntelliJ Idea plugin and mark Kotlin main and test folders as source folders.| |false|
3434
|implicitHeaders|Skip header parameters in the generated API methods.| |false|
35-
|library|Library template (sub-template) to use|<dl><dt>**jvm-ktor**</dt><dd>Platform: Java Virtual Machine. HTTP client: Ktor 1.6.7. JSON processing: Gson, Jackson (default).</dd><dt>**jvm-okhttp4**</dt><dd>[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.</dd><dt>**jvm-spring-webclient**</dt><dd>Platform: Java Virtual Machine. HTTP: Spring 5 (or 6 with useSpringBoot3 enabled) WebClient. JSON processing: Jackson.</dd><dt>**jvm-spring-restclient**</dt><dd>Platform: Java Virtual Machine. HTTP: Spring 6 RestClient. JSON processing: Jackson.</dd><dt>**jvm-retrofit2**</dt><dd>Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.</dd><dt>**multiplatform**</dt><dd>Platform: Kotlin multiplatform. HTTP client: Ktor 1.6.7. JSON processing: Kotlinx Serialization: 1.2.1.</dd><dt>**jvm-volley**</dt><dd>Platform: JVM for Android. HTTP client: Volley 1.2.1. JSON processing: gson 2.8.9 (Deprecated)</dd><dt>**jvm-vertx**</dt><dd>Platform: Java Virtual Machine. HTTP client: Vert.x Web Client. JSON processing: Moshi, Gson or Jackson.</dd></dl>|jvm-okhttp4|
35+
|library|Library template (sub-template) to use|<dl><dt>**jvm-ktor**</dt><dd>Platform: Java Virtual Machine. HTTP client: Ktor 1.6.7. JSON processing: Gson, Jackson (default).</dd><dt>**jvm-okhttp4**</dt><dd>[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.</dd><dt>**jvm-spring-webclient**</dt><dd>Platform: Java Virtual Machine. HTTP: Spring 5 (or 6 with useSpringBoot3 enabled) WebClient. JSON processing: Jackson.</dd><dt>**jvm-spring-restclient**</dt><dd>Platform: Java Virtual Machine. HTTP: Spring 6 (or 7 with useSpringBoot4 enabled) RestClient. JSON processing: Jackson.</dd><dt>**jvm-retrofit2**</dt><dd>Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.</dd><dt>**multiplatform**</dt><dd>Platform: Kotlin multiplatform. HTTP client: Ktor 1.6.7. JSON processing: Kotlinx Serialization: 1.2.1.</dd><dt>**jvm-volley**</dt><dd>Platform: JVM for Android. HTTP client: Volley 1.2.1. JSON processing: gson 2.8.9 (Deprecated)</dd><dt>**jvm-vertx**</dt><dd>Platform: Java Virtual Machine. HTTP client: Vert.x Web Client. JSON processing: Moshi, Gson or Jackson.</dd></dl>|jvm-okhttp4|
3636
|mapFileBinaryToByteArray|Map File and Binary to ByteArray (default: false)| |false|
3737
|modelMutable|Create mutable models| |false|
3838
|moshiCodeGen|Whether to enable codegen with the Moshi library. Refer to the [official Moshi doc](https://github.com/square/moshi#codegen) for more info.| |false|
@@ -50,12 +50,13 @@ 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`&lt;`T`&gt; as return type instead of `T`.| |true|
5656
|useRxJava3|Whether to use the RxJava3 adapter with the retrofit2 library.| |false|
5757
|useSettingsGradle|Whether the project uses settings.gradle.| |false|
5858
|useSpringBoot3|Whether to use the Spring Boot 3 with the jvm-spring-webclient library.| |false|
59+
|useSpringBoot4|Whether to use the Spring Boot 4 with the jvm-spring-restclient library.| |false|
5960

6061
## SUPPORTED VENDOR EXTENSIONS
6162

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
9292
public static final String USE_SETTINGS_GRADLE = "useSettingsGradle";
9393
public static final String IDEA = "idea";
9494
public static final String USE_SPRING_BOOT3 = "useSpringBoot3";
95+
public static final String USE_SPRING_BOOT4 = "useSpringBoot4";
9596
public static final String USE_RESPONSE_AS_RETURN_TYPE = "useResponseAsReturnType";
9697

9798
public static final String DATE_LIBRARY = "dateLibrary";
@@ -252,7 +253,7 @@ public KotlinClientCodegen() {
252253
supportedLibraries.put(JVM_KTOR, "Platform: Java Virtual Machine. HTTP client: Ktor 1.6.7. JSON processing: Gson, Jackson (default).");
253254
supportedLibraries.put(JVM_OKHTTP4, "[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.");
254255
supportedLibraries.put(JVM_SPRING_WEBCLIENT, "Platform: Java Virtual Machine. HTTP: Spring 5 (or 6 with useSpringBoot3 enabled) WebClient. JSON processing: Jackson.");
255-
supportedLibraries.put(JVM_SPRING_RESTCLIENT, "Platform: Java Virtual Machine. HTTP: Spring 6 RestClient. JSON processing: Jackson.");
256+
supportedLibraries.put(JVM_SPRING_RESTCLIENT, "Platform: Java Virtual Machine. HTTP: Spring 6 (or 7 with useSpringBoot4 enabled) RestClient. JSON processing: Jackson.");
256257
supportedLibraries.put(JVM_RETROFIT2, "Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.");
257258
supportedLibraries.put(MULTIPLATFORM, "Platform: Kotlin multiplatform. HTTP client: Ktor 1.6.7. JSON processing: Kotlinx Serialization: 1.2.1.");
258259
supportedLibraries.put(JVM_VOLLEY, "Platform: JVM for Android. HTTP client: Volley 1.2.1. JSON processing: gson 2.8.9 (Deprecated)");
@@ -275,6 +276,7 @@ public KotlinClientCodegen() {
275276
cliOptions.add(CliOption.newBoolean(USE_RX_JAVA3, "Whether to use the RxJava3 adapter with the retrofit2 library."));
276277
cliOptions.add(CliOption.newBoolean(USE_COROUTINES, "Whether to use the Coroutines adapter with the retrofit2 library."));
277278
cliOptions.add(CliOption.newBoolean(USE_SPRING_BOOT3, "Whether to use the Spring Boot 3 with the jvm-spring-webclient library."));
279+
cliOptions.add(CliOption.newBoolean(USE_SPRING_BOOT4, "Whether to use the Spring Boot 4 with the jvm-spring-restclient library."));
278280
cliOptions.add(CliOption.newBoolean(OMIT_GRADLE_PLUGIN_VERSIONS, "Whether to declare Gradle plugin versions in build files."));
279281
cliOptions.add(CliOption.newBoolean(OMIT_GRADLE_WRAPPER, "Whether to omit Gradle wrapper for creating a sub project."));
280282
cliOptions.add(CliOption.newBoolean(USE_SETTINGS_GRADLE, "Whether the project uses settings.gradle."));
@@ -303,8 +305,7 @@ public KotlinClientCodegen() {
303305
cliOptions.add(CliOption.newBoolean(USE_NON_ASCII_HEADERS, "Allow to use non-ascii headers with the okhttp library"));
304306
cliOptions.add(CliOption.newBoolean(USE_RESPONSE_AS_RETURN_TYPE, "When using retrofit2 and coroutines, use `Response`<`T`> as return type instead of `T`.", true));
305307

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

310311
@Override
@@ -473,9 +474,12 @@ public void processOpts() {
473474
convertPropertyToBooleanAndWriteBack(USE_SPRING_BOOT3);
474475
}
475476

476-
if (isUseJackson3()) {
477-
throw new IllegalArgumentException(
478-
"useJackson3 is not yet supported for kotlin-client. Jackson 3 support for kotlin-client will be added in a future release.");
477+
boolean useSpringBoot4 = additionalProperties.containsKey(USE_SPRING_BOOT4)
478+
&& convertPropertyToBooleanAndWriteBack(USE_SPRING_BOOT4);
479+
if (JVM_SPRING_RESTCLIENT.equals(getLibrary()) && useSpringBoot4 && !isUseJackson3()) {
480+
setUseJackson3(true);
481+
additionalProperties.put(USE_JACKSON_3, true);
482+
applyJackson3Package();
479483
}
480484

481485
if (additionalProperties.containsKey(CodegenConstants.SERIALIZATION_LIBRARY)) {
@@ -485,6 +489,22 @@ public void processOpts() {
485489
additionalProperties.put(this.serializationLibrary.name(), true);
486490
}
487491

492+
if (isUseJackson3()) {
493+
if (this.serializationLibrary != SERIALIZATION_LIBRARY_TYPE.jackson) {
494+
throw new IllegalArgumentException("useJackson3 requires serializationLibrary=jackson");
495+
}
496+
if (additionalProperties.containsKey("openApiNullable")
497+
&& Boolean.parseBoolean(additionalProperties.get("openApiNullable").toString())) {
498+
throw new IllegalArgumentException("openApiNullable cannot be set with useJackson3");
499+
}
500+
if (!JVM_OKHTTP4.equals(getLibrary()) && !JVM_SPRING_RESTCLIENT.equals(getLibrary())) {
501+
throw new IllegalArgumentException("useJackson3 is only supported for the jvm-okhttp4 and jvm-spring-restclient libraries at this time.");
502+
}
503+
if (JVM_SPRING_RESTCLIENT.equals(getLibrary()) && !useSpringBoot4) {
504+
throw new IllegalArgumentException("useJackson3 with jvm-spring-restclient requires useSpringBoot4=true.");
505+
}
506+
}
507+
488508
if (additionalProperties.containsKey(MAP_FILE_BINARY_TO_BYTE_ARRAY)) {
489509
setMapFileBinaryToByteArray(convertPropertyToBooleanAndWriteBack(MAP_FILE_BINARY_TO_BYTE_ARRAY));
490510
}
@@ -868,8 +888,9 @@ private void processJvmSpringWebClientLibrary(final String infrastructureFolder)
868888
}
869889

870890
private void processJvmSpringRestClientLibrary(final String infrastructureFolder) {
871-
if (additionalProperties.getOrDefault(USE_SPRING_BOOT3, false).equals(false)) {
872-
throw new RuntimeException("This library must use Spring Boot 3. Try adding '--additional-properties useSpringBoot3=true' to your command.");
891+
if (additionalProperties.getOrDefault(USE_SPRING_BOOT3, false).equals(false)
892+
&& additionalProperties.getOrDefault(USE_SPRING_BOOT4, false).equals(false)) {
893+
throw new RuntimeException("This library requires Spring Boot 3 or 4. Try adding '--additional-properties useSpringBoot3=true' or '--additional-properties useSpringBoot4=true' to your command.");
873894
}
874895

875896
processJvmSpring(infrastructureFolder);

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,21 @@ buildscript {
2323
ext.vertx_version = "5.1.5"
2424
{{/jvm-vertx}}
2525
{{#jvm-spring}}
26+
{{#useSpringBoot4}}
27+
ext.spring_boot_version = "4.1.0"
28+
{{/useSpringBoot4}}
29+
{{^useSpringBoot4}}
2630
{{#useSpringBoot3}}
2731
ext.spring_boot_version = "3.5.16"
2832
{{/useSpringBoot3}}
2933
{{^useSpringBoot3}}
3034
ext.spring_boot_version = "2.7.18"
3135
{{/useSpringBoot3}}
36+
{{/useSpringBoot4}}
3237
{{/jvm-spring}}
38+
{{#useJackson3}}
39+
ext.jackson3_version = "3.1.5"
40+
{{/useJackson3}}
3341
ext.spotless_version = "7.2.1"
3442

3543
repositories {
@@ -151,8 +159,13 @@ dependencies {
151159
{{/gson}}
152160
{{#jackson}}
153161
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
162+
{{#useJackson3}}
163+
implementation "tools.jackson.module:jackson-module-kotlin:$jackson3_version"
164+
{{/useJackson3}}
165+
{{^useJackson3}}
154166
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.22.1"
155167
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.22.1"
168+
{{/useJackson3}}
156169
{{/jackson}}
157170
{{#kotlinx_serialization}}
158171
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0"

‎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.json.JsonMapper
43+
import {{jacksonPackage}}.databind.cfg.DateTimeFeature
44+
{{#enumUnknownDefaultCase}}
45+
import {{jacksonPackage}}.databind.cfg.EnumFeature
46+
{{/enumUnknownDefaultCase}}
47+
import com.fasterxml.jackson.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: JsonMapper = 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-okhttp/infrastructure/ApiClient.kt.mustache‎

Lines changed: 1 addition & 1 deletion
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

‎modules/openapi-generator/src/main/resources/kotlin-client/libraries/jvm-spring-restclient/api.mustache‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ import org.springframework.web.client.RestClient
99
import org.springframework.web.client.RestClientResponseException
1010

1111
{{#jackson}}
12+
{{^useJackson3}}
1213
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
14+
{{/useJackson3}}
15+
{{#useJackson3}}
16+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter
17+
import {{packageName}}.infrastructure.Serializer
18+
{{/useJackson3}}
1319
{{/jackson}}
1420
import org.springframework.http.ResponseEntity
1521
import org.springframework.http.MediaType
@@ -23,11 +29,20 @@ import {{packageName}}.infrastructure.*
2329
{{#nonPublicApi}}internal {{/nonPublicApi}}{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}open {{/nonPublicApi}}class {{classname}}(client: RestClient) : ApiClient(client) {
2430
2531
{{#jackson}}
32+
{{^useJackson3}}
2633
{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}{{/nonPublicApi}}constructor(baseUrl: String) : this(RestClient.builder()
2734
.baseUrl(baseUrl)
2835
.messageConverters { it.add(MappingJackson2HttpMessageConverter()) }
2936
.build()
3037
)
38+
{{/useJackson3}}
39+
{{#useJackson3}}
40+
{{^nonPublicApi}}{{#explicitApi}}public {{/explicitApi}}{{/nonPublicApi}}constructor(baseUrl: String) : this(RestClient.builder()
41+
.baseUrl(baseUrl)
42+
.configureMessageConverters { it.registerDefaults().withJsonConverter(JacksonJsonHttpMessageConverter(Serializer.jacksonObjectMapper)) }
43+
.build()
44+
)
45+
{{/useJackson3}}
3146
{{/jackson}}
3247

3348
{{#operation}}

0 commit comments

Comments
 (0)