Почему Swagger не определяет необязательные свойства JSON? - PullRequest
1 голос
/ 09 мая 2020

У меня есть следующий класс:

import com.fasterxml.jackson.annotation.JsonProperty
import org.joda.time.DateTime
import org.joda.time.DateTimeZone

data class Entity(
        val email: String,
        val name: String,
        val birthDate: DateTime,
        @JsonProperty(required = false) val gender: Gender? = null,
        @JsonProperty(required = false) val country: String? = null,
        val locale: String,
        val disabled: Boolean = false,
        @JsonProperty(required = false) val createdAt: DateTime = DateTime(DateTimeZone.UTC),
        val role: Role,
        val entityTypeId: Long,
        val entityTypeAttributes: MutableMap<String, Any> = HashMap(),
        val medicalSpecialityId: Long? = null,
        val id: Long? = null
)

И некоторые свойства не требуются, потому что они либо допускают значение NULL (пол, страна), либо имеют значение по умолчанию (createdAt).

Однако сгенерированная документация по чванству выглядит следующим образом:

 "components": {
    "schemas": {
      "Entity": {
        "required": [
          "birthDate",
          "createdAt", <------------ Notice here!
          "disabled",
          "email",
          "entityTypeAttributes",
          "entityTypeId",
          "locale",
          "name",
          "role"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "birthDate": {
            "type": "string",
            "format": "date-time"
          },
          "gender": {
            "type": "string",
            "enum": [
              "MALE",
              "FEMALE",
              "OTHER"
            ]
          },
          "country": {
            "type": "string"
          },
          "locale": {
            "type": "string"
          },
          "disabled": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "role": {
            "type": "string",
            "enum": [
              "ADMIN",
              "DOCTOR",
              "PATIENT"
            ]
          },
          "entityTypeId": {
            "type": "integer",
            "format": "int64"
          },
          "entityTypeAttributes": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            }
          },
          "medicalSpecialityId": {
            "type": "integer",
            "format": "int64"
          },
          "id": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
   (...)

Итак, с точки зрения документации, это показывает, что createdAt является обязательным (что неверно) ...

Созданные документы Swagger

Я использую Kotlin, Javalin и интеграцию OpenAPI (io.javalin.plugin.openapi) Javalin.

Я не знаю, что еще мне нужно заставить OpenAPI понять, что createdAt не является обязательным ...

1 Ответ

1 голос
/ 12 мая 2020

Я предполагаю, что реализация kotlin использует допустимость значений NULL как способ обнаружить требуемое и игнорирует требуемое свойство. Например, вам не нужна аннотация для пола и страны.

Очевидно, это не идеально, но если вы измените creadtedAt на DateTime? он не будет отображаться должным образом.

Вероятно, это ошибка инструмента kotlin openapi do c, которую использовал javalin.

...