无法为 Scala 中的枚举列表生成正确的招摇

Pre*_*mer 5 enums scala traits swagger swagger-codegen

在我们的 scala 应用程序中为枚举列表生成 swagger 文档时,生成的 swagger 定义只是空对象。为枚举生成 swagger 文档时,一切都按预期进行,仅在处理枚举列表时才如此。

在 scala 中有多种创建枚举的方式,我们的代码库使用这种方式:

sealed trait AnswerEnum { val value: String }
case object YES extends AnswerEnum { val value = "YES" }
case object NO extends AnswerEnum { val value = "NO" }
Run Code Online (Sandbox Code Playgroud)

假设我们有一个 API,它只有一个端点,预期请求看起来像这样:

case class SomeRequest(answers: Seq[AnswerEnum])
Run Code Online (Sandbox Code Playgroud)

我们想要产生一些招摇,所以我们注释它,它看起来像这样:

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

然后在我们的 swagger 中留下一个定义,如下所示:

"AnswerEnum": {
    "type": "object"
}
Run Code Online (Sandbox Code Playgroud)

虽然我们希望得到的是这样的:

"AnswerEnum": {
    "type": "string",
    "description": "",
    "enum": ["YES", "NO"]
}
Run Code Online (Sandbox Code Playgroud)

如果我们尝试像这样注释上面的密封特征:

"AnswerEnum": {
    "type": "object"
}
Run Code Online (Sandbox Code Playgroud)

我们最终得到了一个 swagger 定义,它看起来更接近我们想要的东西,但不是我们想要的方式或应该如何:

"AnswerEnum": {
    "type": "object",
    "properties": {
        "AnswerEnum": {
            "type": "string",
            "description": "Yes/No Answers",
            "enum": ["YES", "NO"]
        }
    },
    "description": "Enum for Yes/No answers"
}
Run Code Online (Sandbox Code Playgroud)

这是我们最接近正确的方法,但它仍然非常糟糕,根本不正确。

如果我们做这样的事情,我们最终会得到我们当前的解决方案,这不是一个好的解决方案,但它有效:

"AnswerEnum": {
    "type": "string",
    "description": "",
    "enum": ["YES", "NO"]
}
Run Code Online (Sandbox Code Playgroud)

为 SomeRequest 生成的 swagger 至少在某种程度上是正确的,因为它生成的东西表明答案是字符串列表,但它并没有说它是具有允许值的枚举,但它看起来像这样:

@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
}
Run Code Online (Sandbox Code Playgroud)

我们正在使用

产生招摇。