Невозможно сгенерировать правильное чванство для списка перечислений в Scala - PullRequest
4 голосов
/ 01 ноября 2019

При создании документации swagger для списков перечислений в наших приложениях scala генерируемые определения swagger являются только пустыми объектами. При создании документации по перечислениям для перечислений все происходит так, как ожидалось, только при работе со списками перечислений.

В Scala есть несколько способов создания перечислений, наша кодовая база использует этот способ:

sealed trait AnswerEnum { val value: String }
case object YES extends AnswerEnum { val value = "YES" }
case object NO extends AnswerEnum { val value = "NO" }

Если мы представим, что у нас есть API, у которого есть только одна конечная точка, где ожидаемый запрос выглядит примерно так:

case class SomeRequest(answers: Seq[AnswerEnum])

И мы хотим сгенерировать какое-то чванство, поэтому мы аннотируем его так, чтобы оно выглядело так:

@ApiModel(description = "Example Request")
case class SomeRequest(
    @ApiModelProperty(value = "List of answers", required = true) answers: Seq[AnswerEnum]
)

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

"AnswerEnum": {
    "type": "object"
}

В то время как мы ожидаем получить что-то вроде этого:

"AnswerEnum": {
    "type": "string",
    "description": "",
    "enum": ["YES", "NO"]
}

Если мы попытаемся аннотировать вышеупомянутую запечатанную черту следующим образом:

@ApiModel(description = "Enum for Yes/No answers")
sealed trait AnswerEnum {
    val value: String

    @ApiModelProperty(value = "Yes/No Answers", dataType = "string", allowableValues = "YES, NO")
    def getAnswerEnum: String = value
}

В итоге мы получим определение чванства, которое смотрит ближе к тому, что мы хотим, а не к тому, как мы этого хотим или каким оно должно быть:

"AnswerEnum": {
    "type": "object",
    "properties": {
        "AnswerEnum": {
            "type": "string",
            "description": "Yes/No Answers",
            "enum": ["YES", "NO"]
        }
    },
    "description": "Enum for Yes/No answers"
}

Это самое близкое, что мы получили, чтобы получить это правильно, но это все еще очень плохо и совсем не правильно.

Если мы делаем что-то подобное, мы в конечном итоге получаемнаштекущее решение, которое не является хорошим решением, но оно работает:

@ApiModel(description = "Example Request")
case class SomeRequest(
    @ApiModelProperty(value = "List of answers", dataType = "[Ljava.lang.String;", required = true, allowableValues = "YES, NO") answers: Seq[AnswerEnum]
)

Сгенерированный чванство для SomeRequest, по крайней мере, несколько правильно, в том смысле, что он генерирует что-то, что говорит, что ответы являются списком строк,но это не говорит, что это перечисление с допустимыми значениями, однако это выглядит так:

"SomeRequest": {
    "type": "object",
    "required": [
      "answers"
    ],
    "properties": {
      "answers": {
        "type": "array",
        "description": "List of answers",
        "items": {
          "type": "string"
        }
      }
    },
    "description": "Example Request"
  }

Мы используем

для генерации чванства.

...