Razvan
11/04/2020, 3:13 PMinfo:
title: Test API
version: v1.0
description: null
tags: []
paths:
/contract/api/v1/echo:
post:
summary: echoes the name and message sent to it
description: null
tags:
- /contract/api/v1
parameters: []
requestBody:
content:
application/json:
example:
name: jim
message: hello!
schema:
$ref: '#/components/schemas/NameAndMessage'
description: null
example: null
required: true
responses:
'200':
description: OK
content:
application/json:
example:
name: jim
message: hello!
schema:
$ref: '#/components/schemas/NameAndMessage'
description: null
example: null
security:
- api_key: []
operationId: postContractApiV1Echo
deprecated: false
components:
schemas:
NameAndMessage:
properties:
name:
example: jim
description: null
type: string
message:
example: hello!
description: null
type: string
example:
name: jim
message: hello!
description: null
type: object
required:
- message
- name
securitySchemes:
api_key:
type: apiKey
in: query
name: api
openapi: 3.0.0
and the online editor
https://editor.swagger.io/dave
11/04/2020, 3:15 PMRazvan
11/04/2020, 3:20 PMdave
11/04/2020, 3:21 PMinline fun <reified T : Any> Body.Companion.auto(description: String? = null, contentNegotiation: ContentNegotiation = None) = autoBody<T>(description, contentNegotiation)
Razvan
11/04/2020, 3:23 PMdave
11/04/2020, 3:30 PMJsonPropertyDescription
Razvan
11/04/2020, 3:59 PMval nameAndMessageLens = Body.auto<NameAndMessage>(description = "It's the name and the message").toLens()
data class NameAndMessage(
@JsonPropertyDescription("It's the name")
val name: String,
@JsonPropertyDescription("It's the message")
val message: String)
I get the descriptions if I use the default Jackson as param
renderer = OpenApi3(ApiInfo("Http4KPres API", "v1.0"), Jackson)
"name": {
"example": "jim",
"description": "It's the name",
"type": "string"
}
but if i use a custom one (that's exactly the same as the Jackson object)
val customJackson = ConfigurableJackson(KotlinModule()
.asConfigurable()
.withStandardMappings()
.done()
.deactivateDefaultTyping()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false)
.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
.configure(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS, true)
)
renderer = OpenApi3(ApiInfo("Http4KPres API", "v1.0"), customJackson)
I get a null description
"name": {
"example": "jim",
"description": null,
"type": "string"
},
dave
11/04/2020, 5:00 PMRazvan
11/04/2020, 5:15 PMCosmin Victor Celea
11/04/2020, 5:49 PMRazvan
11/04/2020, 5:56 PM.setSerializationInclusion(JsonInclude.Include.NON_NULL)
that i commented out just to see it it was that setting that removing the description from @JsonPropertyDescription)Jackson
get description from JsonPropertyDescription with CustomJackson
nope. The Body.auto description does not appear for neither.
data class NameAndMessage(
@JsonPropertyDescription("It's the name")
val name: String,
@JsonPropertyDescription("It's the message")
val message: String)
val nameAndMessageLens = Body.auto<NameAndMessage>("It's the name and the message").toLens()
object ExampleContractRoute {
private val spec = "/echo" meta {
summary = "echoes the name and message sent to it"
description = "This is a exemple that echoes the input string"
receiving(nameAndMessageLens to NameAndMessage("jim", "hello!"))
returning(Status.OK, nameAndMessageLens to NameAndMessage("jim", "hello!"))
} bindContract <http://Method.POST|Method.POST>
private val echo: HttpHandler = { request: Request ->
val received: NameAndMessage = nameAndMessageLens(request)
Response(Status.OK).with(nameAndMessageLens of received)
}
operator fun invoke(): ContractRoute = spec to echo
}
val app = routes(
"/contract/api/v1" bind contract {
// renderer = OpenApi3(ApiInfo("Http4KPres API", "v1.0"), customJackson)
renderer = OpenApi3(ApiInfo("Test API", "v1.0"), Jackson)
descriptionPath = "/swagger.json"
routes += ExampleContractRoute()
}
)
fun main() {
DebuggingFilters.PrintRequest()
.then(app)
.asServer(Undertow(9000)).start()
}
object CustomJackson : ConfigurableJackson(KotlinModule()
.asConfigurable()
.withStandardMappings()
.done()
.deactivateDefaultTyping()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false)
.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
.configure(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS, true)
// .setSerializationInclusion(JsonInclude.Include.NON_NULL)
)