当前位置: 首页 > 知识库问答 >
问题:

使用Swashback在Swagger中显示枚举值和引用的类

壤驷心思
2023-03-14

我正在使用Swashback生成Swagger输出。在我的模型I上,具有以下属性:

public FieldValue? MyProperty { get; set; }

FieldValue是一个简单的类,可以保存ID和名称:

public class FieldValue
{
    /// <summary>
    /// The numerical represenation of the value.
    /// </summary>
    /// <example>1</example>
    public string Id { get; set; }

    /// <summary>
    /// The textual represenation of the value.
    /// </summary>
    /// <example>SomeValue</example>
    public string Name { get; set; }
}

通过代码中的一些业务逻辑,一组可能的键值对(ID和名称)映射到此属性。

现在,我想在我的Swagger输出中的enum标签中显示所有可能的值。使用ISchemaFilter的一个实现,即MyProperty属性上的一个自定义属性,并使用allOf而不是简单的ref,我成功地在我的JSON输出中添加了值,见下文。使用allOf而不仅仅是ref的原因是ref将覆盖引用架构上的所有属性。因此,当我使用allOf时,它将我的描述和枚举字段保留在文档中。

{
    "components": {
        "schemas": {
            "FieldValue": {
                "type": "object",
                "properties": {
                    "Id": {
                        "type": "string",
                        "description": "The numerical represenation of the value.",
                        "nullable": true,
                    },
                    "Name": {
                        "type": "string",
                        "description": "The textual represenation of the value.",
                        "nullable": true,
                    }
                }
            },
            "MyProperty": {
                "enum": [
                    "1: EnumValue1",
                    "2: EnumValue2",
                    "3: EnumValue3"
                ],
                "allOf": [{
                        "$ref": "#/components/schemas/FieldValue"
                    }
                ],
                "description": "Some description",
                "nullable": true
            }
    }
}

不过,这不会在Swagger UI中显示枚举值。它会显示描述。

这个Swagger文档有效吗?如果不是,如何使其有效并显示MyProperty的枚举?

共有1个答案

谷德本
2023-03-14

用例的正确表示形式是:

  "MyProperty": {
    "enum": [
      {"Id": "1", "Name": "EnumValue1"},
      {"Id": "2", "Name": "EnumValue2"},
      {"Id": "3", "Name": "EnumValue3"}
    ],
    "allOf": [
       { "$ref": "#/components/schemas/FieldValue" }
     ],
    "description": "Some description",
    "nullable": true
  }

然而,对于包含对象文字的枚举,几乎没有工具支持。我建议在MyProperty属性的描述中提及可能的Id和Name值。

 类似资料:
  • 更新: ====================================================== 在我的团队的项目中,我们有一个带有java.time.temporal.ChronOunit字段的实体。在类中,是这样定义的: 此枚举类型具有索引(NANOS、秒、小时等),以及与这些索引关联的键值对,如 这并不重要,除非自动化测试工具会发现这些名称,并在请求中发送一个名称,然后请

  • 例如: Swagger这样显示枚举: 我想要的是: API返回“显示名称”,然而,Swagger显示“枚举名称”,这经常导致混淆。有可能改变狂妄的价值观吗?

  • 我正在使用从以下依赖项导入的Swagger/OpenAPIV3注释创建应用程序的API描述: 其中一个批注是批注,它接受名为的属性,该属性允许字符串数组: 现在,我想使用在枚举类上构造的自定义方法,该方法返回允许的字符串数组,因此不需要在每次向枚举添加类型时添加该方法。以便我们可以这样使用它: 现在这是无法编译的,因为在执行注释时不知道该方法。是否有这样的解决方案允许在SwaggerV3注释属性值

  • 在尝试获取allowableValues标记的枚举值时,我遇到了以下错误。 批注属性apimodelProperty.AllowAbleValues的值必须是常量表达式 我想做的是: 我有可能做我想做的事吗?我知道在我的API中只公开枚举是可能的,然后swagger会自动识别允许的值,但是需要将有问题的字段公开为字符串,即使我们的内部逻辑将其作为枚举。 提前感谢您的帮助!

  • 无法获取如何将字符串类型的引用与数组参数中的枚举值一起使用。我可以在items键中进行引用,并且它正在工作,但Swagger产生错误:不是有效的参数定义 Web UI生成界面,但它有文本区,而不是我期望的多选框。 正确的做法是什么? 我的代码: