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

多态性中的“鉴别器”,OpenAPI 2.0(Swagger 2.0)

范修伟
2023-03-14

引用OpenAPI 2.0模式对象或Swagger 2.0模式对象,并将鉴别器字段定义为:

增加了对多态性的支持。鉴别器是用于区分继承此架构的其他架构的架构属性名称。使用的属性名称必须在此架构中定义,并且必须位于必需的属性列表中。使用时,该值必须是此架构或继承它的任何架构的名称。

我的困惑/问题:

  • 对我来说,它究竟在继承或多态性中扮演什么角色是不明确的。能不能请一些人用一个工作示例来解释鉴别器,说明它到底是做什么的,如果我们不使用它该怎么办?在某些操作中,是否存在任何错误、警告或任何依赖于它的工具
  • 是不是因为swagger editor不支持鉴别器,而该字段用于其他一些工具

到目前为止,我已经尝试过:

  • 我曾尝试使用swagger editor和同一文档(也在下面提到)中的示例来处理这个属性,看看是否可以看到它的任何特殊行为。我更改了属性,将其删除,并将Dog模型扩展到更深一层,并在新的子模型上尝试了相同的操作,但在swagger editor的预览中没有看到任何更改
  • 我试着在网上搜索,特别是一些问题,但没有找到任何相关信息

我用来做实验的示例代码:

definitions:
  Pet:
    type: object
    discriminator: petType
    properties:
      name:
        type: string
      petType:
        type: string
    required:
    - name
    - petType
  Cat:
    description: A representation of a cat
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        huntingSkill:
          type: string
          description: The measured skill for hunting
          default: lazy
          enum:
          - clueless
          - lazy
          - adventurous
          - aggressive
      required:
      - huntingSkill
  Dog:
    description: A representation of a dog
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          default: 0
          minimum: 0
      required:
      - packSize

共有2个答案

符渊
2023-03-14

在OpenApi 3中,鉴别器功能有了很大的改进。现在,您提供了一个鉴别器对象,其中包含鉴别器属性的名称,以及该属性的值到模式名称的映射。

(我知道你问过OpenAPI2,但这在3中有很大的改进,希望你能利用它)。

见:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject对于v3。0.0规格

彭弘伟
2023-03-14

根据这个google组,在allOf属性之上使用了判别器,并且它被定义在多态的超级类型中。如果不使用判别器allOf关键字描述了一个模型包含其他模型的属性以进行组合。

就像在示例代码中一样,Pet是一个超级类型,其属性为petType,标识为鉴别器CatPet的子类型。以下是Cat对象的json示例:

{
  "petType": "Cat",
  "name": "‎Kitty"
}

使用鉴别器旨在指示用于识别对象类型的属性。假设有一些工具可以使用鉴别器正确支持定义对象,则可以通过扫描属性来确定类型。例如,根据petType识别对象是Cat

然而,鉴别器字段在当前版本的规范或样本中没有得到很好的定义(见第403期)。据我所知,斯威格目前还没有提供适当的工具来支持它。

如果模型具有用于确定类型的属性,则可以使用鉴别器。在这种情况下,它是自然适合的,并且可以用作其他开发人员理解多态关系的指标。如果考虑支持鉴别器(请参见本gif和示例中的petType)的ReDoc等第三方工具,您可能会发现这很有用。

 类似资料:
  • 问题内容: 是否可以强制休眠将歧视符列用于继承的继承类型?根据JPA2.0规范,这应该可行,但是我无法在休眠状态下实现。 例: 使用hibernate.hbm2ddl.auto create时,这甚至都不会在表PARENT中创建列TYPE。 我知道InheritanceType.JOINED可以在不定义鉴别符列的情况下工作,但是它是非常无效的,因为在使用鉴别符列中的信息时,休眠需要在父对象和所有子

  • 我正在编写一个服务,它的GET可以返回五种不同但密切相关的类型中的一种。因为用户希望能够一次搜索所有五种类型,所以只能进行一次get调用。我返回的是JSON,可以轻松处理任何类型。 我正试图在斯威格中这样做,使用他们的多态性特性,这是我以前从未尝试过的。我的做法与示例中的一样,只是在“定义”下,而不是在“组件/模式”下。但我收到了一条奇怪的错误信息,我无法理解。下面是swagger文件。错误是这样

  • Discriminator 是一种 schema 继承机制。 他允许你在相同的底层 MongoDB collection 上 使用部分重叠的 schema 建立多个 model。 假设你要在单个 collection 中记录多种 event, 每个 event 都有时间戳字段,但是 click 事件还有 URL 字段, 这时你可以用 model.discriminator() 实现上述要求。 此函

  • 我有一个标准的多态类型<code>Shape</code>,我可以使用标准的<code>@JsonTypeInfo</code>机制对其进行多态反序列化: 但是,我想添加<code>作为鉴别器属性的别名,以便以下JSON字符串由abstract类反序列化: AND { “?”: “ 这样这个测试案例就会通过 我为什么要这样做?:我试图将两个不同的现有可区分联合编码方案反序列化到同一个类层次结构中

  • 我有一个这样的场景 它的子类具有鉴别器值“creator” 现在,我不想再为帐户类型“user”添加一个类(类似于),因为“creator”和“user”都与帐户类型相关。 我需要一个可能的解决方案,在这里设置我的鉴别器值要么‘创建者’或‘用户’的基础上,帐户的类型。 有没有办法根据条件在类内部设置我的鉴别器值? 我如何继续执行? 请帮帮我。

  • 有人能提供一个简单的例子来解释Java中动态多态性和静态多态性之间的区别吗?