Skip to content

Commit 8957a45

Browse files
mtraynhammichaelpro1
authored andcommitted
[kotlin][client] Add Jackson to interface properties and remove extra line feed (OpenAPITools#5459)
* [kotlin][client] Ensure Jackson annotations are consistent with interface vars * [kotlin][client] Rebuild samples * [kotlin][client] Some kotlin client enhancements - Don't use JsonFormat for Date objects, this should be controlled via a custom serializer/deserializer or a turning on and off serialization features of Jackson. I've updated the jacksonObjectMapper config to write the dates as strings, which I think was intended in the original commit. https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/SerializationFeature.html#WRITE_DATES_AS_TIMESTAMPS https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/cfg/MapperConfig.html#getDateFormat-- - Dont' use @jsonformat(shape = JsonFormat.Shape.OBJECT) for enums. This causes Enums to be formatted as objects with an internal "value" field. In reality, OpenAPI enums are just strings without properties and should be treated as a string. https://www.baeldung.com/jackson-serialize-enums#2-enum-as-json-object - Add's Kotlin use site annotation @get: to JsonProperty for parent interface properties. Otherwise Kotlin will warn: "This annotation is not applicable to target 'member property without backing field or delegate'" - Add's JsonTypeInfo annotations to interfaces for inheritance. This was copied verbatim from the kotlin-spring generator. https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/kotlin-spring/typeInfoAnnotation.mustache * [kotlin][client] Rebuild kotlin samples
1 parent 2f656a9 commit 8957a45

File tree

81 files changed

+278
-618
lines changed

Some content is hidden

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

81 files changed

+278
-618
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import com.squareup.moshi.JsonClass
1010
{{/moshi}}
1111
{{#jackson}}
1212
import com.fasterxml.jackson.annotation.JsonProperty
13-
import com.fasterxml.jackson.annotation.JsonFormat
13+
{{#discriminator}}
14+
import com.fasterxml.jackson.annotation.JsonSubTypes
15+
import com.fasterxml.jackson.annotation.JsonTypeInfo
16+
{{/discriminator}}
1417
{{/jackson}}
1518
{{#parcelizeModels}}
1619
import android.os.Parcelable
@@ -34,7 +37,7 @@ import java.io.Serializable
3437
{{#parcelizeModels}}
3538
@Parcelize
3639
{{/parcelizeModels}}
37-
{{#multiplatform}}@Serializable{{/multiplatform}}{{#moshi}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/moshi}}
40+
{{#multiplatform}}@Serializable{{/multiplatform}}{{#moshi}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/moshi}}{{#jackson}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{/jackson}}
3841
{{#nonPublicApi}}internal {{/nonPublicApi}}{{#discriminator}}interface{{/discriminator}}{{^discriminator}}data class{{/discriminator}} {{classname}}{{^discriminator}} (
3942
{{#vars}}
4043
{{#required}}{{>data_class_req_var}}{{/required}}{{^required}}{{>data_class_opt_var}}{{/required}}{{^-last}},{{/-last}}
@@ -57,7 +60,6 @@ import java.io.Serializable
5760
* Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}}
5861
*/
5962
{{#multiplatform}}@Serializable(with = {{nameInCamelCase}}.Serializer::class){{/multiplatform}}
60-
{{#jackson}}{{#isPrimitiveType}}@JsonFormat(shape = JsonFormat.Shape.NATURAL){{/isPrimitiveType}}{{^isPrimitiveType}}@JsonFormat(shape = JsonFormat.Shape.OBJECT){{/isPrimitiveType}}{{/jackson}}
6163
{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{{nameInCamelCase}}}(val value: {{#isListContainer}}{{{ nestedType }}}{{/isListContainer}}{{^isListContainer}}{{{dataType}}}{{/isListContainer}}){
6264
{{#allowableValues}}
6365
{{#enumVars}}

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
@SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
1010
{{/gson}}
1111
{{#jackson}}
12-
{{#isDateTime}}
13-
@JsonFormat
14-
(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
15-
{{/isDateTime}}
1612
@JsonProperty("{{{vendorExtensions.x-base-name-literal}}}")
1713
{{/jackson}}
1814
{{/multiplatform}}
19-
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}
15+
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
@JsonProperty("{{{vendorExtensions.x-base-name-literal}}}")
1313
{{/jackson}}
1414
{{/multiplatform}}
15-
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") @Required {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}
15+
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") @Required {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import com.google.gson.annotations.SerializedName
55
{{#moshi}}
66
import com.squareup.moshi.Json
77
{{/moshi}}
8+
{{#jackson}}
9+
import com.fasterxml.jackson.annotation.JsonProperty
10+
{{/jackson}}
811
{{/multiplatform}}
912
{{#multiplatform}}
1013
import kotlinx.serialization.*
@@ -16,7 +19,6 @@ import kotlinx.serialization.internal.CommonEnumSerializer
1619
* Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}}
1720
*/
1821
{{#multiplatform}}@Serializable(with = {{classname}}.Serializer::class){{/multiplatform}}
19-
{{#jackson}}@JsonFormat(shape = JsonFormat.Shape.OBJECT){{/jackson}}
2022
{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{classname}}(val value: {{{dataType}}}){
2123
2224
{{#allowableValues}}{{#enumVars}}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
{{#gson}}
99
@SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
1010
{{/gson}}
11+
{{#jackson}}
12+
@get:JsonProperty("{{{vendorExtensions.x-base-name-literal}}}")
13+
{{/jackson}}
1114
{{/multiplatform}}
1215
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}?

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
{{#gson}}
99
@SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
1010
{{/gson}}
11+
{{#jackson}}
12+
@get:JsonProperty("{{{vendorExtensions.x-base-name-literal}}}")
13+
{{/jackson}}
1114
{{/multiplatform}}
1215
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") @Required {{/multiplatform}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import java.util.UUID
2424
{{/gson}}
2525
{{#jackson}}
2626
import com.fasterxml.jackson.databind.ObjectMapper
27+
import com.fasterxml.jackson.databind.SerializationFeature
2728
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
2829
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
2930
import com.fasterxml.jackson.annotation.JsonInclude
@@ -70,5 +71,6 @@ import java.util.Date
7071
.registerModule(Jdk8Module())
7172
.registerModule(JavaTimeModule())
7273
.setSerializationInclusion(JsonInclude.Include.NON_ABSENT)
74+
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
7375
{{/jackson}}
7476
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
2+
@JsonSubTypes(
3+
{{#discriminator.mappedModels}}
4+
JsonSubTypes.Type(value = {{modelName}}::class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"){{^-last}},{{/-last}}
5+
{{/discriminator.mappedModels}}
6+
)

samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@ import com.google.gson.annotations.SerializedName
2222

2323
data class ApiResponse (
2424
@SerializedName("code")
25-
val code: kotlin.Int? = null
26-
,
25+
val code: kotlin.Int? = null,
2726
@SerializedName("type")
28-
val type: kotlin.String? = null
29-
,
27+
val type: kotlin.String? = null,
3028
@SerializedName("message")
3129
val message: kotlin.String? = null
32-
3330
)
3431

samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ import com.google.gson.annotations.SerializedName
2121

2222
data class Category (
2323
@SerializedName("id")
24-
val id: kotlin.Long? = null
25-
,
24+
val id: kotlin.Long? = null,
2625
@SerializedName("name")
2726
val name: kotlin.String? = null
28-
2927
)
3028

0 commit comments

Comments
 (0)