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)
我们正在使用
产生招摇。
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |